【问题标题】:Dynamically choose column in SQL query在 SQL 查询中动态选择列
【发布时间】:2012-01-17 06:53:50
【问题描述】:

我有一个数据库字段名称调用 Code,我正在尝试使用如下所示的变量名称来选择它:

Declare @var1 = [Code]

(SELECT @var1
 FROM [VoucherType]
 WHERE [DeletedBy] IS NULL
 AND [AutoID] = 1)

显然,SQL 会将@var1 解释为字符串而不是我的数据库的字段,我怎么能以这种方式将@var1 识别为字段名称[Code] 而不是可能没有任何字符串的字符串select 或 if 语句。

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    试试这个:

    DECLARE @var1 VARCHAR(20)
    DECLARE @sql VARCHAR(255)
    
    SET @var1 = 'Code'
    SET @sql = 'select ' + QUOTENAME(@var1) + ' from [VoucherType] where [DeletedBy] is null and [AutoID] = 1'
    
    EXEC sp_executesql @sql
    

    您必须编写一个动态查询,并使用sp_executesql 执行

    要在“动态”方面添加更多内容,请使用存储过程。示例见这里:

    http://www.marten-online.com/database/execute-dynamic-sql-in-mssql.html

    也就是说……如果您使用的是 Microsoft SQL SERVER

    【讨论】:

    • + @var1 + 应该是 + QUOTENAME(@var1) + 以避免在列名中出现空格和其他可能的特殊字符的问题。它还有助于防止可能的注入问题。此外,如果您正在编写一个逗号分隔的列表,则每个单独的列名都应通过 QUOTENAME 传递。
    【解决方案2】:

    您需要使用动态 SQL。

    declare @ColName varchar(128)
    
    declare @sql varchar(4000)
    
    Set @ColName='Code';
    
    select @sql = 'SELECT '+@ColName+'
      FROM [VoucherType]
     WHERE [DeletedBy] IS NULL
     AND [AutoID] = 1'
      exec sp_executesql @sql
    go
    

    这篇文章可能会有所帮助

    Accessing a table from a name in a variable

    SQL: Select dynamic column name based on variable

    问候

    【讨论】:

    • EXEC 应避免使用sp_executesql,因为它更有效:reference
    【解决方案3】:

    您不能在 SELECT 语句中使用类似的变量。

    您需要创建动态 TSQL。

    您不指定您的 RDBMS,但在 SQL Server 中您将使用sp_executesql(最好)或EXEC

    Declare @var1 varchar(100)
    Declare @sql varchar(1000)
    
    SET @var1 = '[Code]' 
    SET @sql = ' select ' + @var1 + ' from [VoucherType]' +
               ' where [DeletedBy] is null and [AutoID] = 1'
    
    EXEC sp_executesql @sql
    

    请务必阅读:The Curse and Blessings of Dynamic SQL

    【讨论】:

      【解决方案4】:

      请尝试以下代码:

      DECLARE @var1 VARCHAR(50)
      
      SET @var1 = '[Code]'
      
      EXEC ('SELECT ' + @var1 + ' FROM [VoucherType]  
             WHERE [DeletedBy] IS NULL AND [AutoID] = 1 ')
      

      【讨论】:

      • EXEC 应避免使用sp_executesql,因为它更有效:reference
      猜你喜欢
      • 2019-06-10
      • 2019-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 2021-08-07
      • 2021-10-08
      • 1970-01-01
      相关资源
      最近更新 更多