我知道我想得太多了,但我一直反對這個問題太久了,所以我正在尋求幫助。
這是我試圖運行的陳述句:SELECT @cntMax = MAX(id) FROM [Raw_Item-FieldReport]
但是,表名是一個變數@reportTable
這不起作用:
SET @sql = 'SELECT @cntMax = MAX(id) FROM @reportTable'
EXEC sp_executesql @sql
我什至嘗試在 中包含實際的表名SET @sql,但這也不起作用。我不認為這會這么困難,請告訴我我錯過了一些簡單/明顯的東西。
這是為那些想要它的人提供的完整代碼:
DECLARE
@inTable nvarchar(255) = 'Raw_Item',
@reportTable nvarchar(255),
@fieldName nvarchar(255),
@cnt int,
@cntMax int,
@sql nvarchar(max)
SET @reportTable = @inTable '-FieldReport'
SET @cnt = 1
SELECT @cntMax = MAX(id) FROM [Raw_Item-FieldReport]
PRINT @cntMax
SET @cntMax = 0
SET @sql = 'SELECT @cntMax = MAX(id) FROM [Raw_Item-FieldReport]'
EXEC sp_executesql @sql
PRINT @cntMax
SQL Server 12.0.2008.8(在 Azure 上)
uj5u.com熱心網友回復:
您需要使用輸出引數,否則 SQL Server 不知道如何@cntMax在動態 SQL 中連接到@cntMax 不在動態 SQL 中,因為它們是不同的作用域。為了保護自己免受 SQL 注入(此處和此處的一些提示),請始終檢查您的物件是否存在,并使用QUOTENAME()而不是手動添加方括號(并且QUOTENAME()在從用戶輸入或變數構建物件名稱時應始終使用,即使它們是不要有像破折號這樣的壞字符):
DECLARE @sql nvarchar(max),
@inTable nvarchar(255) = N'Raw_Item',
@reportTable nvarchar(255);
SET @reportTable = N'dbo.' QUOTENAME(@inTable '-FieldReport');
IF OBJECT_ID(@reportTable) IS NOT NULL
BEGIN
SET @sql = N'SELECT @cntMax = MAX(id) FROM ' @reportTable N';';
EXEC sys.sp_executesql @sql,
N'@cntMax int output',
@cntMax = @cntMax OUTPUT;
PRINT @cntMax;
END
ELSE
BEGIN
PRINT 'Nice try, h@xx0rs!';
END
始終使用模式參考( dbo),始終使用陳述句終止符,并且請盡量避免使用諸如破折號 ( -) 之類的無效識別符號字符命名事物。還有一個提示:始終N在N'nvarchar string literals'.
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/320757.html
標籤:sql sql-server 变量 动态-sql
下一篇:我需要提取較低和較高數量的序列
