SQL - 从列表中传递列名的动态方法

时间:2016-03-22 03:48:15

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

我有一个表格,用于存储列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中执行此操作?

提前致谢

2 个答案:

答案 0 :(得分: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并执行相同的操作

答案 1 :(得分:0)

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

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

示例输出如下 enter image description here