【问题标题】:SQL - Dynamic way to pass column names from a listSQL - 从列表中传递列名的动态方式
【发布时间】:2016-07-08 19:57:45
【问题描述】:

我有一个表,我在其中存储列 namea,它看起来像这样:

header
Ref_1
Ref_4
Ref_6
Ref_100

我想运行一个动态 sql,它将使用表上的值作为列名,应该如下所示:

select mycolumn1, mycolumn2 a from mytable1 b inner join a.ref = **b.ref_1**
select mycolumn1, mycolumn2 a from mytable1 b inner join a.ref = **b.ref_4**
select mycolumn1, mycolumn2 a from mytable1 b inner join a.ref = **b.ref_6**
select mycolumn1, mycolumn2 a from mytable1 b inner join a.ref = **b.ref_100**

在这里你看到 b.ref_{#} 应该是动态传递的,我有什么办法吗?

我可以使用 C# 脚本或 SQL Server 集成服务轻松做到这一点,但我想在 T_SQL 中做到这一点?

提前致谢

【问题讨论】:

  • 你的select语句不正确? from 子句中缺少表 a
  • 您是否需要特定列的所有列的脚本?

标签: sql sql-server sql-server-2008 tsql dynamic


【解决方案1】:
declare @str varchar(max) = (
   select 'select mycolumn1, mycolumn2 a from mytable1 b inner join a.ref = b. ' + your_column_table.header
   from your_column_table
)

然后你可以执行@str

如果你想生成单独的 sql 语句,你需要遍历 your_column_table 并做同样的事情

【讨论】:

  • 虽然闪烁方法可以解决问题,但首选方法是使用 sp_execute_sql。
【解决方案2】:

如果您需要循环并为每个列名运行查询,您可以尝试以下查询:

DECLARE @q nvarchar(max)
DECLARE @ctr INT

SELECT @ctr= COUNT(1) FROM mytable1

WHILE (@ctr>0)
BEGIN

   SELECT @q= 
       'select mycolumn1, mycolumn2 a from mytable1 b inner join a.ref = b.' + 
         namea 
    FROM (
          SELECT namea, ROW_NUMBER() OVER(ORDER BY namea ASC) AS R 
          FROM mytable1 
         ) T WHERE R=@ctr

  SET @ctr=@ctr-1
  EXEC(@q)
END

示例输出如下

【讨论】:

    猜你喜欢
    • 2020-07-31
    • 2021-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多