我在 SQL Server 中有一個動態存盤程序,可以很好地透視表:
CREATE PROCEDURE dbo.DynamicPivotTableInSql
@ColumnToPivot NVARCHAR(255),
@ListToPivot NVARCHAR(255),
@SurveyID INT=10
AS
BEGIN
DECLARE @SqlStatement NVARCHAR(MAX)
SET @SqlStatement = N'SELECT *
FROM
(SELECT
[resp_id], [benefit], [weight]
FROM Segment_Responses) myResults
PIVOT
(SUM([weight])
FOR [' @ColumnToPivot ']
IN (' @ListToPivot ')) AS PivotTable';
EXEC (@SqlStatement)
END
我這樣稱呼它
EXEC DynamicPivotTableInSql
@ColumnToPivot = 'benefit',
@ListToPivot = '[OBSERVABILITY], [COST], [EASE OF USE], [SERVICE]'
這是我遇到問題的地方。您會注意到我已經硬編碼@SurveyID = 10,如果我嘗試將其添加為存盤程序中的 where 陳述句,如下所示:
FROM Segment_Responses
WHERE survey_id = ' @SurveyID '
并再次運行存盤程序,我收到此錯誤:
將 nvarchar 值 ' SELECT * FROM ( SELECT [resp_id], [benefit], [weight] FROM Segment_Responses wheresurvey_id=' 轉換為資料型別 int 時轉換失敗。
我嘗試了很多方法來解決這個問題(例如,傳遞 Int 變數而不是硬編碼它)但總是得到相同的結果。有什么想法嗎?
uj5u.com熱心網友回復:
只是為了增加一些清晰度,當您將兩種不同的型別相加時,SQL Server 將(在可能的情況下)隱式地將一種型別轉換為另一種型別 - 畢竟結果必須是單一型別。
它根據優先順序決定將哪個“轉換為另一個” 。
因此,當您嘗試將varchar與int連接時,int具有更高的優先級。這也是在運算式的不同執行路徑中混合型別時使用case 運算式時出現錯誤和錯誤的常見原因。
您需要明確并將 int 轉換為varchar。
理想情況下,您將使用引數化查詢,該查詢也將重用快取的執行計劃 - 如果資料的基數相似,這可能是有益的,但有時動態地使查詢的值部分是有利的,這取決于用例。
uj5u.com熱心網友回復:
EXEC (@SQL)這就是為什么強烈建議不要使用該語法的原因。使用sys.sp_executesql并引數化您的陳述句:
SET @SQL = N'SELECT ...
FROM ...
WHERE survey_id = @SurveyID ...;';
EXEC sys.sp_executesql @SQL, N'@SurveyID int',SurveyID;
uj5u.com熱心網友回復:
唯一適用于 字串。如果您使用數字,TSQL 假定您正在嘗試使用加法運算子,并嘗試將字串引數轉換為 int。
例如這個
select 1 '2'
作業并回傳 3。
使用CONCAT代替 ,或對 int 使用顯式轉換。
例如
WHERE survey_id = ' cast(@SurveyID as varchar(20)) '
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/414994.html
標籤:
