我試圖執行這個查詢:表名作爲變量
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
這將產生以下錯誤:
Msg 1087, Level 16, State 1, Line 5
Must declare the table variable "@tablename".
什麼是有表名動態填充的正確方法?
我試圖執行這個查詢:表名作爲變量
declare @tablename varchar(50)
set @tablename = 'test'
select * from @tablename
這將產生以下錯誤:
Msg 1087, Level 16, State 1, Line 5
Must declare the table variable "@tablename".
什麼是有表名動態填充的正確方法?
表名和列名必須是靜態的,如果查詢是靜態的。對於動態表名或列名,應該動態生成完整的SQL,並使用sp_executesql執行它。
不能爲一個變量使用一個表名,你不得不這樣做,而不是:
DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
你需要動態地生成SQL:
declare @tablename varchar(50)
set @tablename = 'test'
declare @sql varchar(500)
set @sql = 'select * from ' + @tablename
exec (@sql)
你的最後一條語句改成這樣:
EXEC('SELECT * FROM ' + @tablename)
這是我做我的在一個存儲過程中。第一個塊將聲明該變量,並根據當前年份和月份名稱設置表名,在這種情況下爲TEST_2012OCTOBER。然後我檢查它是否已經存在於數據庫中,並且如果它確實存在,則將其刪除。然後下一個塊將使用一個SELECT INTO語句來創建該表,並用另一個帶有參數的表中的記錄填充該表。
--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''')
有點晚了一個答案,但應該幫忙別人:
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
Declare @fs_e int, @C_Tables CURSOR, @Table varchar(50)
SET @C_Tables = CURSOR FOR
select name from sysobjects where OBJECTPROPERTY(id, N'IsUserTable') = 1 AND name like 'TR_%'
OPEN @C_Tables
FETCH @C_Tables INTO @Table
SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = '@C_Tables'
WHILE (@fs_e <> -1)
BEGIN
exec('Select * from '+ @Table)
FETCH @C_Tables INTO @Table
SELECT @fs_e = sdec.fetch_Status FROM sys.dm_exec_cursors(0) as sdec where sdec.name = '@C_Tables'
END
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
我已經把是p
這篇文章需要編輯,可能需要一些解釋.. – 2017-07-25 12:15:49
QUOTENAME是安全的重要線路。謝謝。 – 2015-04-28 10:05:43
但是如何從這樣的查詢返回值?例如。 'COUNT(*)'? – Suncatcher 2018-03-03 09:57:12