【问题标题】:Insert column names into stored procedure SELECT statement from separate table从单独的表中将列名插入存储过程 SELECT 语句
【发布时间】:2015-08-13 13:06:00
【问题描述】:

我正在尝试找出将 Table1 中保存的列名插入针对 Table2 运行的 SELECT 语句的最佳方法。此查询在存储过程中运行。这并不能很好地解释,所以假设我在 Table1 中有这些值:

我想要做的是在针对 Table2 的 SELECT 语句中使用这些列名:

Select -- Column Names
from Table2
where UserId = 3;

我不确定是否可以以这种方式使用输入参数或如何将值传递给它。例如:

Select @ColumnNames
from Table2
where UserId = 3;

或者可能是表 2 的连接?

谢谢!

【问题讨论】:

    标签: sql sql-server sql-server-2008


    【解决方案1】:

    您必须使用动态 SQL

    declare @columns varchar(1000)
    declare @sql varchar(8000)
    select @columns='', @sql=''
    
    select @columns=@columns+value+',' from table1
    
    set @columns=left(@columns,len(@columns)-1)
    set @sql='select '+@columns+' from table2'
    exec(@sql)
    

    但要小心 SQL 注入并阅读 www.sommarskog.se/dynamic_sql.html

    【讨论】:

    • Dynamic Sql 从安全角度来看让我害怕,但如果它是唯一的选择,我可能不得不充分利用它
    • 你应该将变量设为 nvarchar 并使用sp_executeSQL 来执行它。
    【解决方案2】:

    您可以查询系统表以获取列,即(取出 WHERE 子句以查看所有表和列)

    SELECT tab.name AS TableName,
      col.name AS ColName, 
      tp.name AS SType,
      col.max_length,
      col.[precision],
      (CASE col.is_nullable 
             WHEN 1 THEN 'true'
             WHEN 0 THEN 'false'
             ELSE 'unknown'
       END) AS Is_Nullable
    FROM sys.tables as tab
    LEFT OUTER JOIN sys.columns AS col
      ON tab.object_id = col.object_id 
    LEFT OUTER JOIN sys.types AS tp
      ON col.system_type_id = tp.system_type_id
    WHERE tab.name = 'Table1'
    ORDER BY tab.name,col.name
    

    【讨论】:

      猜你喜欢
      • 2012-07-22
      • 2016-03-05
      • 1970-01-01
      • 1970-01-01
      • 2014-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多