【发布时间】:2021-05-03 12:54:22
【问题描述】:
我正在尝试遍历包含表名列表的临时表变量。我想简单地计算每个表中 DateTracked 列大于 30 天的行。我无法动态更改 FROM @tblName 变量以存储记录数,然后将其插入到我的跟踪表中。最终我将使用一个游标来遍历每个,但我只想先为单个表获取这个逻辑。这是我的测试代码:
DECLARE @tblName as NVARCHAR(MAX)
DECLARE @q as NVARCHAR(MAX)
SET @q = 'Select Count(DateTracked) FROM Audit.' + @tblName + ' WHERE DateTracked > DATEADD(dd, -30, CAST(GETDATE() as date))'
--DECLARE @tblNameTable TABLE
--(
-- tableName NVARCHAR(MAX)
--)
--INSERT INTO @tblNameTable VALUES (N'myTestTable')
DECLARE @ExpectedRecordsToMove AS TABLE (col1 int)
INSERT INTO @ExpectedRecordsToMove EXECUTE sp_executesql @q, N'@tblName nvarchar(500)', @tblName = 'myTestTable'
SELECT * FROM @ExpectedRecordsToMove
【问题讨论】:
-
您不能参数化
@q,因为即使在动态SQL 中也不能参数化表名; 整个语句 必须动态生成,因为@tblName必须插入到文本中。如果您在生成@q之前设置@tblName,您将获得与循环相同的效果。 -
不,这正是不会起作用的。同样,表名不能是参数。
'SELECT ...' + @tblName + ' WHERE ...'是正确的,但是@tblName必须已经有一个值,并且不应作为参数传递。在您的示例中,DECLARE @tblName AS SYSNAME = 'myTestTable'. -
我现在明白了。生成该语句后,如何获取 sp_executesql 的输出并将其插入我可以引用的变量中?
-
不确定问题出在哪里——
INSERT ... EXEC适用于表变量,因此其余代码都可以。INSERT当然不应该发生在动态生成的语句中,因为那样你就不能引用外部范围的变量。 -
我现在明白了。我声明了一个局部变量,而不是一个临时表变量。它现在似乎工作了。
标签: sql sql-server dynamic-sql