2

我正在尝试将 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 变量中以供存储过程的其他部分访问。

4

3 回答 3

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
于 2013-10-03T15:40:50.900 回答
4

T-SQL 中的所有用户定义变量具有私有本地范围。任何其他执行上下文都看不到它们,甚至嵌套的也看不到(与嵌套范围可以看到的#temp 表不同。使用“ @@ ”试图欺骗它来制作一个全局变量是行不通的。

如果要执行动态 SQL 并返回信息,有几种方法可以做到:

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

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

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

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

  5. 使用会话上下文信息缓冲区(不推荐)。

但是,正如其他人所指出的那样,您实际上并不需要动态 SQL 来处理您在这里展示的内容。你可以这样做:

SET @x = ( SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS 
            WHERE Table_name  = @TabName
              AND column_name = @colName )
于 2013-10-03T15:47:51.787 回答
1

您可能要考虑将 sp_executesql 存储过程用于动态 sql。

以下链接提供了带有输出参数的 sp_executesql 过程的一个很好的使用示例:

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

于 2013-10-03T15:41:53.663 回答