Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 57
  • Last Modified:

Querying changing table name

SQL 2008

I have a table that I am querying from that keeps, changing the number on the end of it.
The last 4 digits keep changing on a daily or sometimes 2 or 3 times a day

Metric2824

Query
Select number, Created
from Metric2824

I go in on a daily basis and change the numbers to the maximum number

How can I change the query so it grabs the latest 4 digit number on the Metric table?

Thanks
0
halifaxman
Asked:
halifaxman
  • 3
  • 2
  • 2
  • +3
1 Solution
 
Vitor MontalvãoMSSQL Senior EngineerCommented:
You'll need a dynamic query.
DECLARE @TableName AS sysname
DECLARE @MySelect AS VARCHAR(MAX)

SET @TableName='Metric2824'

SET @MySelect = 'SELECT * FROM ' + @TableName

EXEC(@MySelect)

Open in new window

0
 
ste5anSenior DeveloperCommented:
You don't change that query. The user or process, which is creating that table is responsible for updating your view.

But Vitor is right, you need under most circumstances dynamic SQL for that. This should be the last step in the data import/table creation process:

DECLARE @alterview NVARCHAR(MAX) = N'ALTER VIEW Query AS SELECT M.number, M.Created FROM ? M;';
DECLARE @tablename sysname;

SET @tablename = ( SELECT TOP 1
                            T.name
                   FROM     sys.tables T
                   WHERE    T.name LIKE 'Metric____'
                   ORDER BY T.name DESC
                 );

SET @alterview = REPLACE(@alterview, '?', @tablename);

EXECUTE (@alterview);

Open in new window

0
 
Jim HornMicrosoft SQL Server Developer, Architect, and AuthorCommented:
>I go in on a daily basis and change the numbers to the maximum number
A vastly better idea would be to keep the table name the same but add a date column that stores the date of the data.  That way no one will have to use dynamic SQL to concatenate table names with the date when consuming this table.
0
Build your data science skills into a career

Are you ready to take your data science career to the next step, or break into data science? With Springboard’s Data Science Career Track, you’ll master data science topics, have personalized career guidance, weekly calls with a data science expert, and a job guarantee.

 
Valliappan ANSenior Tech ConsultantCommented:
Another option is to have virtual tables, i.e. have a common table, with a field called TableName or something like that, and let users put data in the same table, with different TableName value each time. Then you can query it easily with 'select * from commonTable where TableName = (SELECT max(TableName) from commonTable)'
0
 
Scott PletcherSenior DBACommented:
You can avoid dynamic SQL if you can insure that only one copy of this code can run at one time.

Create a unique synonym for that code, then dynamically alter the synonym to match the new table name, like this:

DECLARE @current_table_name nvarchar(128)

SELECT TOP (1) @current_table_name = name
FROM sys.tables
WHERE name LIKE 'Metric%'
ORDER BY CAST(SUBSTRING(name, PATINDEX('%[0-9]%', name), 128) AS int) DESC

EXEC('IF OBJECT_ID(''dbo.MySyn'') IS NOT NULL DROP SYNONYM dbo.MySyn')
EXEC('CREATE SYNONYM dbo.MySyn FOR dbo.' + @current_table_name)

--from this point on, the code process "dbo.MySyn" as the "table" name, w/o needing dynamic SQL
SELECT *
FROM dbo.MySyn
WHERE ...
0
 
halifaxmanAuthor Commented:
Hi

Thanks for the answers I have tried

DECLARE @current_table_name nvarchar(128)

SELECT TOP (1) @current_table_name = name
FROM sys.tables
WHERE name LIKE 'Metric%'
ORDER BY CAST(SUBSTRING(name, PATINDEX('%[0-9]%', name), 128) AS int) DESC

EXEC('IF OBJECT_ID(''dbo.MySyn'') IS NOT NULL DROP SYNONYM dbo.MySyn')
EXEC('CREATE SYNONYM dbo.MySyn FOR dbo.' + @current_table_name)

--from this point on, the code process "dbo.MySyn" as the "table" name, w/o needing dynamic SQL
SELECT *
FROM dbo.MySyn

I get the error message when running it

Conversion failed when converting the nvarchar value 'Metric' to data type int.
0
 
Scott PletcherSenior DBACommented:
Then you have non-numeric chars after the first numeric char.  If you always need to pick up exactly 4 digits, you can do this:

SELECT TOP (1) @current_table_name = name
FROM sys.tables
WHERE name LIKE 'Metric%'
ORDER BY CAST(SUBSTRING(name, PATINDEX('%[0-9][0-9][0-9][0-9]%', name), 4) AS smallint) DESC
0
 
halifaxmanAuthor Commented:
Thanks for getting back to me

I have had a look at some of the older tables and not all have 4 digits which is causing the problem

Examples

Metric_Draft
Metric94
Metric961
0
 
ste5anSenior DeveloperCommented:
Why? You said the newer have all four Digits. Then just look for These tables. Either 'Metric____' or 'Metric[0-9][0-9][0-9][0-9]', depending on your nameing scheme.
0
 
Scott PletcherSenior DBACommented:
Maybe this then?:

SELECT TOP (1) @current_table_name = name
FROM sys.tables
WHERE name LIKE 'Metric%'
ORDER BY create_date DESC /*get the last-created table*/
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 3
  • 2
  • 2
  • +3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now