所以我正在使用MS SQL,我正在尝试设置我的语句,以便在执行代码时可以轻松打印日志。出于某种原因,我的变量似乎超出了范围,我无法确定原因。
收到错误:Must declare the scalar variable "@Ideas"
什么有用的片段(又名不打印):
DECLARE @Ideas TABLE(IdeaID int)
INSERT INTO @Ideas (IdeaID)
SELECT IdeaID FROM dbo.Ideas
WHERE IdeaID IN (5,6,7)
DELETE FROM dbo.TableA WHERE IdeaID IN (SELECT IdeaID FROM @Ideas)
DELETE FROM dbo.TableB WHERE IdeaID IN (SELECT IdeaID FROM @Ideas)
DELETE FROM dbo.TableC WHERE IdeaID IN (SELECT IdeaID FROM @Ideas)
然后从各种表继续删除,但总是使用相同的ID数组...我尝试提供打印交易的方法:
DECLARE @PopulateIdeas varchar(500)
DECLARE @Ideas TABLE(IdeaID int)
SET @PopulateIdeas =
'
INSERT INTO' + @Ideas + '(IdeaID)
SELECT [IdeaID]
FROM [dbo].[Ideas]
WHERE [IdeaID] IN (5,6,7,8)
'
PRINT @PopulateIdeas
EXECUTE (@PopulateIdeas)
此时我甚至没有尝试设置删除,因为我被困在填充临时表并打印出来......所有帮助/建议都很受欢迎。
答案 0 :(得分:0)
您遇到的问题是本地变量@ideas
的范围,因为执行调用函数sp_executesql
要解决此问题,您必须在字符串中移动declare语句。
这是一个很好的模式,但要做到这一点,您只需将代码更改为:
DECLARE @PopulateIdeas varchar(500)
SET @PopulateIdeas =
'DECLARE @Ideas TABLE(IdeaID int);
INSERT INTO @Ideas(IdeaID)
SELECT [IdeaID]
FROM [dbo].[Ideas]
WHERE [IdeaID] IN (5,6,7,8)
'
PRINT @PopulateIdeas
EXECUTE (@PopulateIdeas)
答案 1 :(得分:0)
正如其他人所说,这是一个范围问题。一个解决方法是使用" #temp"表格如下。它不是一个理想的解决方案,特别是如果涉及到大量数据,但对于小型集合,它应该没问题。
DECLARE @PopulateIdeas varchar(500)
CREATE TABLE #Ideas (IdeaID int)
SET @PopulateIdeas =
'
INSERT INTO #Ideas (IdeaID)
SELECT IdeaID
FROM dbo.Ideas
WHERE IdeaID IN (5,6,7,8)
'
PRINT @PopulateIdeas
EXECUTE (@PopulateIdeas)