【问题标题】:Referencing SQL Server columns dynamically in SP在 SP 中动态引用 SQL Server 列
【发布时间】:2011-05-03 17:32:11
【问题描述】:

SQL 2008

你好,

我有一个相当不同的任务必须在 SQL 中完成。它比这更复杂一些,但我会尽量让它变得简单。

我需要以某种方式动态选择一列。像这样:

declare @ColName varchar(50)

select @ColName = 'Column1' --This is an actual column name in a real table called 'MyTable'

select @ColName from MyTable where Column2 = 123

有没有办法做这样的事情?任何帮助或指导将不胜感激!

谢谢, 杰森

【问题讨论】:

    标签: sql sql-server tsql stored-procedures


    【解决方案1】:

    您需要动态 SQL,但首先阅读 The Curse and Blessings of Dynamic SQL 以确保您不会为 SQL Injection 敞开心扉

    【讨论】:

      【解决方案2】:
      DECLARE @colNameIn AS varchar(50) = 'Column1'
      
      DECLARE @template AS varchar(MAX) = 'select {@ColName} from MyTable where Column2 = 123' -- This template can be expanded
      
      -- Protect yourself from injection or invalid columns:
      DECLARE @ColName AS varchar(50)
      SELECT @ColName = COLUMN_NAME
      FROM INFORMATION_SCHEMA.COLUMNS
      WHERE TABLE_NAME = 'MyTable' 
          AND COLUMN_NAME = @ColNameIn
      
      IF @ColName IS NOT NULL
      BEGIN
          DECLARE @sql AS varchar(MAX)
          SET @sql = REPLACE(@template, '{@ColName}', QUOTENAME(@ColName))
          EXEC (@sql)
      END
      

      【讨论】:

        【解决方案3】:

        阅读@SQLMenace 答案中的链接!

        declare @ColName varchar(50)
        select @ColName = 'Column1'
        
        declare @sql varchar(MAX)
        select @sql = 'select ' + @ColName + ' MyTable where Column2 = 123'
        
        exec (@sql)
        

        【讨论】:

          【解决方案4】:

          如果您已在过程中预定义了所有可接受的列名,则可以使用 CASE 语句执行此操作。

          DECLARE @ColName varchar(50)
          
          SET @ColName = 'Column1'
          
          SELECT CASE @ColName
                   WHEN 'Column1' THEN Column1
                   WHEN 'Column2' THEN Column2
                 END
          FROM MyTable
          WHERE Column2 = 123
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-11-01
            • 2016-08-02
            • 2011-07-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多