T-SQL:可变范围

时间:2013-10-03 15:35:07

标签: sql sql-server tsql sql-server-2005 stored-procedures

我正在尝试将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>

3 个答案:

答案 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并返回信息,有几种方法可以执行此操作:

  1. 使用sp_ExecuteSQL并将其中一个参数设为OUTPUT参数(建议用于单个值)。

  2. 在调用动态SQL之前创建一个#Temp表,然后让Dynamic SQL写入相同的#Temp表(推荐用于多个值/行)。

  3. 使用INSERT..EXEC语句执行动态SQL,该动态SQL将其信息作为SELECT语句的输出返回。如果INSERT表的格式与动态SQL的SELECT输出格式相同,则数据输出将插入到表中。

  4. 如果只想返回整数值,可以通过动态SQL中的RETURN语句执行此操作,并通过@val = EXEC('...')接收。

  5. 使用Session context-info缓冲区(不推荐)。

  6. 然而,正如其他人所指出的那样,你实际上不应该为你在这里展示的内容提供动态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过程的一个很好的用法示例:

http://support.microsoft.com/kb/262499