我是动态SQL的初学者,并尝试编写动态sql代码,其中我需要包含一个表变量。当我尝试包含表变量时,我收到一条错误,说我需要包含静态变量
以下只是代码的一部分
DECLARE @NAMES TABLE (name varchar)
DECLARE @fields varchar(max);
.
.
.
Select @fields=FROM sys.columns
WHERE object_id=object_id('dbo.employees')
order by name
SET @SQL=''
SET @SQL='Select '+ @fields
SET @SQL=@SQL + ' from dbo.test()'
SET @SQL = @SQL + ' WHERE name IN'
SET @SQL= @SQL + '(Select name from '
SET @SQL=@SQL + @NAMES +')'
答案 0 :(得分:0)
首先,您的SELECT获取列名称根本不起作用。你需要这样的东西:
DECLARE @fields nvarchar(max);
SET @fields = N'';
SELECT @fields += CASE WHEN LEN(@fields) = 0 THEN N'' ELSE N', ' END + name
FROM sys.columns
WHERE object_id=object_id('dbo.employees')
ORDER BY column_id
PRINT @fields;
老实说,我不确定你的SQL正在尝试做什么......它试图从一个名为test的表值函数的返回中选择employee表中的字段( )?名称'该test()结果集中的列是什么?在我给你一个完整的答案之前,你需要更加清楚。一个主要的问题是你从来没有用任何东西实际填充你的表变量,所以......我不知道你要去做什么。了解Test()函数的定义也会有所帮助。
但至少上面的内容会将@fields变量正确设置为表dbo.employee中的列列表。
在执行动态SQL时,确实有助于写出所需的最终结果SQL,然后确定应该通过可变数据填充SQL的哪些部分,然后向后工作。然后,构建SQL以构建动态SQL要容易得多。
答案 1 :(得分:0)
您需要将表变量逻辑包含在动态sql
中--You need to load @names inside dynamic sql
DECLARE @fields varchar(max);
.
.
.
Select @fields=FROM sys.columns
WHERE object_id=object_id('dbo.employees')
order by name
SET @SQL='DECLARE @NAMES TABLE (name varchar); '
SET @SQL +=' Select '+ @fields
SET @SQL=@SQL + ' from dbo.test()'
SET @SQL = @SQL + ' WHERE name IN'
SET @SQL= @SQL + '(Select name from '
SET @SQL=@SQL + ' @NAMES )'
或者你可以加载到临时表并访问动态sql中的temptable。这意味着你将像#names一样加载temptable,然后在动态sql中使用它......