Ich versuche diese Abfrage auszuführen:
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
Das erzeugt den folgenden Fehler:
Meldung 1087, Ebene 16, Status 1, Zeile 5
Muss die Tabellenvariable "@tablename" deklarieren.
Was ist der richtige Weg, um den Tabellennamen dynamisch auszufüllen?
Tabellennamen und Spaltennamen müssen statisch sein, wenn die Abfrage statisch ist. Für dynamische Tabellen- oder Spaltennamen sollten Sie das vollständige SQL dynamisch generieren und es mit sp_executesql ausführen.
Weitere Details hier: Der Fluch und Segen von dynamischem SQL
Ändern Sie Ihre letzte Aussage dazu:
EXEC('SELECT * FROM ' + @tablename)
So mache ich meine in einem gespeicherten Verfahren. Der erste Block deklariert die Variable und setzt den Tabellennamen auf der Grundlage des aktuellen Jahres- und Monatsnamens, in diesem Fall TEST_2012OCTOBER. Ich überprüfe dann, ob es bereits in der Datenbank vorhanden ist, und entferne es, falls dies der Fall ist. Der nächste Block verwendet dann eine SELECT INTO-Anweisung, um die Tabelle zu erstellen und Datensätze aus einer anderen Tabelle mit Parametern zu füllen.
--DECLARE TABLE NAME VARIABLE DYNAMICALLY
DECLARE @table_name varchar(max)
SET @table_name =
(SELECT 'TEST_'
+ DATENAME(YEAR,GETDATE())
+ UPPER(DATENAME(MONTH,GETDATE())) )
--DROP THE TABLE IF IT ALREADY EXISTS
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = @table_name AND xtype = 'U')
BEGIN
EXEC('drop table ' + @table_name)
END
--CREATES TABLE FROM DYNAMIC VARIABLE AND INSERTS ROWS FROM ANOTHER TABLE
EXEC('SELECT * INTO ' + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''')
Sie können keinen Tabellennamen für eine Variable verwenden. Stattdessen müssen Sie Folgendes tun:
DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
Etwas zu spät für eine Antwort, sollte aber jemand anderem helfen:
CREATE PROCEDURE [dbo].[GetByName]
@TableName NVARCHAR(100)
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE @sSQL nvarchar(500);
SELECT @sSQL = N'SELECT * FROM' + QUOTENAME(@TableName);
EXEC sp_executesql @sSQL
END
Sie müssen die SQL dynamisch generieren:
declare @tablename varchar(50)
set @tablename = 'test'
declare @sql varchar(500)
set @sql = 'select * from ' + @tablename
exec (@sql)
Verwenden Sie sp_executesql
, um ein beliebiges SQL auszuführen, z.
DECLARE @tbl sysname,
@sql nvarchar(4000),
@params nvarchar(4000),
@count int
DECLARE tblcur CURSOR STATIC LOCAL FOR
SELECT object_name(id) FROM syscolumns WHERE name = 'LastUpdated'
ORDER BY 1
OPEN tblcur
WHILE 1 = 1
BEGIN
FETCH tblcur INTO @tbl
IF @@fetch_status <> 0
BREAK
SELECT @sql =
N' SELECT @cnt = COUNT(*) FROM dbo.' + quotename(@tbl) +
N' WHERE LastUpdated BETWEEN @fromdate AND ' +
N' coalesce(@todate, ''99991231'')'
SELECT @params = N'@fromdate datetime, ' +
N'@todate datetime = NULL, ' +
N'@cnt int OUTPUT'
EXEC sp_executesql @sql, @params, '20060101', @cnt = @count OUTPUT
PRINT @tbl + ': ' + convert(varchar(10), @count) + ' modified rows.'
END
DEALLOCATE tblcur
Sie können dies auch verwenden ...
DECLARE @SeqID varchar(150);
DECLARE @TableName varchar(150);
SET @TableName = (Select TableName from Table);
SET @SeqID = 'SELECT NEXT VALUE FOR '+ @TableName + '_Data'
exec (@SeqID)