【问题标题】:T-SQL: Variable ScopeT-SQL:变量范围
【发布时间】:2013-10-10 09:25:46
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    您不需要动态查询来实现您想要的,下面的查询将给出与您相同的结果。

      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
    

    【讨论】:

    • 您的代码运行良好,只需添加我使用 'set @x = (select @x)' 来存储为变量,再次感谢
    【解决方案2】:

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

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

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

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

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

    4. 如果你只想返回一个整数值,你可以通过动态SQL中的RETURN语句来实现,通过@val = EXEC('...')接收。

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

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

    SET @x = ( SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS 
                WHERE Table_name  = @TabName
                  AND column_name = @colName )
    

    【讨论】:

    • 非常详细的答案和有趣的阅读,但是在您回复之前,我已经将另一个答案标记为完整。 +1
    【解决方案3】:

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

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

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

    【讨论】:

    • 感谢链接,有趣的阅读,添加为书签(Y)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2021-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多