2010-06-23 118 views
1

如何傳遞並使用列名在實際列中檢索bigint變量?如何在存儲過程中將列作爲參數傳遞?

DECLARE @personID BIGINT, 
DECLARE @queryString varchar(500) 

Set @queryString = 'Select @personID = ' + @PersonColumnID + ' from dbo.Loss_Witness where WitnessID = @witnessID' 
exec(@queryString) 

錯誤消息狀態「必須聲明變量'@personID'」。我也試過

Set @queryString = 'Select ' + @personID + ' = ' + @witnessPersonID + ' from dbo.Loss_Witness where WitnessID = @witnessID' 

並得到了錯誤信息「Error conversion data type varchar to bigint。」

有什麼想法?

回答

6

你需要指定@personID與OUTPUT關鍵字的輸出參數:

DECLARE @SQL NVARCHAR(max) 
    SET @SQL = 'SELECT @personID = w.' + @PersonColumnID + ' 
        FROM dbo.Loss_Witness w 
       WHERE w.witnessID = @witnessID ' 

BEGIN 

    EXEC sp_executesql @SQL, @personID = @personID OUTPUT, @witnessID 

END 

another example here

1

另請注意,代碼中可能存在SQL注入安全漏洞。如果你沒有清理@PersonColumnID,那麼你可能會遇到很大的麻煩。

+0

@OMG Ponies這裏仍然存在風險,即使輕微:列名不能作爲參數傳遞給sp_executesql,因此也不能將輸入中的串聯原因(但請注意值已參數化)。 – 2010-06-23 20:45:13

+0

我很努力去理解這個評論。您引用的論文非常好,並且在動態SQL上進行了標準讀取。但是不管如何,除非@PersonColumnID被清理,否則在給定的代碼和重寫中有一個巨大的SQL注入點。提問者可能沒有意識到這一點。 – Yellowfog 2010-06-23 20:52:13

+0

SELECT @PersonColumnID ='1; drop database blah - '; – Yellowfog 2010-06-23 20:54:04

相關問題