我正在尝试将SQL查询的结果存储到变量中。查询只是检测列的数据类型,因此返回的结果是单个varchar。
SET @SQL =
'declare @@x varchar(max) SET @@x = (select DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_name = ' +char(39)+@TabName+char(39) +
' AND column_name = ' +char(39)+@colName+char(39) + ')'
EXECUTE (@SQL)
'SET声明'中的任何内容都无法访问它之外的任何变量,反之亦然,因此我坚持如何将此查询的结果存储在varchar变量中,以供存储过程的其他部分访问。 / p>
答案 0 :(得分:6)
你不需要动态查询来实现你想要的,下面的查询会得到与你相同的结果。
declare @x varchar(max)
declare @tableName varchar(100), @ColumnName varchar(50)
set @tableName = 'Employee'
set @ColumnName = 'ID'
select @x = DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
where
Table_Name = @tableName
and column_name = @ColumnName
select @x
答案 1 :(得分:3)
T-SQL中的所有用户定义变量都只有私有本地范围的 。任何其他执行上下文都不能看到它们,甚至不能嵌套它们(与#temp表不同,嵌套作用域可以看到 )。使用“ @@ ”试图欺骗它制作全局变量不起作用。
如果要执行动态SQL并返回信息,有几种方法可以执行此操作:
使用sp_ExecuteSQL并将其中一个参数设为OUTPUT
参数(建议用于单个值)。
在调用动态SQL之前创建一个#Temp表,然后让Dynamic SQL写入相同的#Temp表(推荐用于多个值/行)。
使用INSERT..EXEC
语句执行动态SQL,该动态SQL将其信息作为SELECT语句的输出返回。如果INSERT
表的格式与动态SQL的SELECT
输出格式相同,则数据输出将插入到表中。
如果只想返回整数值,可以通过动态SQL中的RETURN
语句执行此操作,并通过@val = EXEC('...')
接收。
使用Session context-info缓冲区(不推荐)。
然而,正如其他人所指出的那样,你实际上不应该为你在这里展示的内容提供动态SQL。你可以这样做:
SET @x = ( SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_name = @TabName
AND column_name = @colName )
答案 2 :(得分:1)
您可能需要考虑将sp_executesql存储过程用于动态sql。
以下链接提供了带有输出参数的sp_executesql过程的一个很好的用法示例: