2016-03-22 62 views
4

我在那裏我存儲列namea表看起來是這樣的:SQL - 動態的方式從列表中通過列名

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中做到這一點?

在此先感謝

+0

您的選擇語句不正確? from子句中缺少表「a」。 – AKS

+0

對於特定列,您是否需要所有列的腳本? – DhruvJoshi

回答

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和做同樣的事情

+0

儘管閃爍方法可以解決問題,但首選的方法是使用sp_execute_sql。 – Vincent

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 [email protected] 

    SET @[email protected] 
    EXEC(@q) 
END 

樣品輸出低於 enter image description here