2013-10-19 63 views
0

我想在SQL Server存儲過程中生成select語句。我有SQL參數中的列名稱。SQL Server:在具有動態列名的存儲過程內動態生成select語句

我想用選定的列名以編程方式生成select語句,但似乎無法在存儲過程中找到正確的語法。

CREATE PROCEDURE dbo.aProc 
    @testCondition int, 
    @colCount int, 
    @column_1 varchar(100) = null, 
    .... 
    @column_40 varchar(100) null 
AS 
    DECLARE @qry nvarchar(3000) 
    DECLARE @Iterator int 

    SET @testtype = 2 
    SET @Iterator = 0 
    SET @qry ='SELECT ' 

    WHILE (@Iterator < @colCount-1) 
    BEGIN 
     SET @qry = @qry + ''[email protected]_''+CAST(@Iterator as varchar(2))+','' 
     Set @Iterator = @Iterator + 1 
    END 


    SET @qry = @qry + ''@column_+CAST(@colCount as varchar(2)) FROM aTable where aCol = @testCondition 
+0

你爲什麼需要+''+零件?你也有2個引號,而不是冒號後的引號。你能解釋一下你試圖在你的proc中實現什麼嗎? –

+0

我想根據想要查看的列生成SELECT stmnt,所以對我來說最簡單的方法是在sql para中傳遞列名並基於它們,我在存儲過程中動態生成sql select stmnt。 – user1889838

+0

嗯,我會說更改你的proc簽名更容易,你可以傳遞像'column1,column2,column3'等字符串,如果你真的確定你想要做這個任務 –

回答

0

這看起來像一個壞主意(obligatory sql injection link)與可能的替代

要回答這個問題,然後做這樣的事。

​​

這是較少的努力做這種方式 - 或者作爲意見建議 - 比循環(這順便說一句,你是富裕的大關)亂搞。

說實話,雖然你似乎是更好使用內聯函數

CREATE FUNCTION dbo.vSomeTable 
    (@id INT) 
RETURNS TABLE 
AS 
RETURN (
    SELECT * FROM tbl WHERE condition = @id 
) 

,然後讓用戶做

SELECT col1, col2, col2 FROM dbo.vSomeTable(4) 

這是更好的比

EXEC dbo.aProc @condition=1, @col1='col1', @col2='col2' 
0
CREATE PROCEDURE dbo.aProc 
    @tablename varchar(100), 
    @testCondition int, 
    @colCount int, 
    @column_1 varchar(100) = '', 
    .... 
    @column_40 varchar(100) '' 
AS 
BEGIN 
if object_id('tempdb..#t') is not null 
drop table #t 


select 
table_name 
,column_name 
into #t 
from information_schema.columns 
where [email protected] 
and column_name in 
(@column_1,@column_2,@column_3,@column_4,@column_5 
..... 
@column_36,@column_37,@column_38,@column_39,@column_40) 

select 
    'select '+ 
    stuff((
    select ', ' + 'isnull('+t2.column_name+','''') as' +t2.column_name+CHAR(10) 
    from #t t2 
    where t2.table_name = #t.table_name 
    for xml path ('')) 
,1,2,'')+' from ' +#t.table_name 
from #t 
group by #t.table_name 

END 

我不是很崇拜LOOP。事實上,我討厭循環查詢。