2015-07-22 47 views
0

我試圖在SSRS中將參數轉換爲十進制。我有一個in條款,因爲它的多選。我可以選擇1並且運行良好,但是如果我選擇多於1,它會說SSRS將參數鑄造成十進制多選

「關鍵字附近的語法錯誤」爲「。」。

我在我的查詢語句中的where子句中轉換我的參數。

WHERE LOAD_NO IN(CAST(@Load爲十進制))

我很困惑,爲什麼它會帶回的語法錯誤,如果我選擇了多個從列表中。

感謝

回答

1

我很困惑,爲什麼它會帶回的語法錯誤,如果我 選擇多個從列表中。

簡短的回答

因爲WHERE LOAD_NO IN (CAST(1,2,N as DECIMAL))不是一個有效的T-SQL語句。


龍答案

當您在查詢中使用多值參數,報表服務會,如果你的參數包含1倍的值,或多個值產生不同的查詢。

讓我們來簡化你的榜樣以下查詢:

SELECT * FROM TABLE WHERE LOAD_NO IN (@Load) 

只有一個值,該查詢將具有以下格式:

exec sp_executesql N'SELECT * FROM TABLE WHERE LOAD_NO IN (@Load)', N'@Load int', @Load=<YourValue> 

這是帶有參數的查詢:@Load

現在,具有多個值,查詢將成爲

exec sp_executesql N'SELECT * FROM TABLE WHERE LOAD_NO IN (<YourValue1>, <YourValue2>,<YourValueN>)' 

@Load參數已取代值的列表。

因此,現在我的建議是重新考慮您的查詢設計,並將@Load作爲值列表。

我們不能爲您提供最佳的解決方案,因爲它確實取決於數據,只有您擁有所有的細節,但我仍然可以拋出一些想法。

我的頭,我能想到的頂部:

  • 演員LOAD_NO代替,但執行計劃可能會失去,如果任何索引的好處。
  • 在大多數情況下,在可能的情況下使用IF EXISTS而不是IN
  • 使用子查詢。

如果您有其他問題,請不要猶豫,運行SQL Server Profiler查看生成的查詢。

0

我不知道你的數據是什麼樣子,所以我不知道如果這些選項會有所幫助,但這裏有幾個建議:

  1. 嘗試把CASTLOAD_NO代替:

    WHERE CAST(LOAD_NO爲varchar)IN(@Load)

  2. WHERE clau創建splitString函數喜歡這裏的接受後(T-SQL split string)和訪問SE:

    WHERE LOAD_NO IN(SELECT CAST(VAL爲十進制)FROM dbo.splitString(@Load, ''))