2013-03-07 136 views
0

我有一個名爲「@IDs」的輸入參數的存儲過程。這將從我的應用程序中填充,該應用程序將按照以下格式填充它:'2,30,105'。當然,這個參數中的值數量會有所不同(例如:有時@IDs會是'100,2005,2,510')。我的存儲過程非常簡單。我有一張名爲「人員」的表格。我試圖寫這個查詢:使用「IN」語句存儲過程參數SQL

Select * From Persons Where P_Id in (@IDs) 

P_ID是我的表中的主鍵。我得到的錯誤是'將轉換varchar值'2,3,4'轉換爲數據類型int'時轉換失敗。'任何建議將不勝感激。謝謝。

+0

我意識到這個問題是針對SQL Server的,但答案仍然適用。 – Yuck 2013-03-07 00:26:02

回答

0

你可能需要做一個準備好的聲明。這個想法是建立選擇的句子,然後執行它。下面是關於如何做到這一點的例子...

USE mydb; 

DROP PROCEDURE IF EXISTS execSql; 
DELIMITER // 
CREATE PROCEDURE execSql (
       IN sqlq VARCHAR(5000) 
       ) COMMENT 'Executes the statement' 
BEGIN 
    SET @sqlv=concat(concat('select abc from yourtable where abc in (',sqll),')'); 
    PREPARE stmt FROM @sqlv; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt; 
END // 
DELIMITER ; 

只要改變查詢要執行的一個。

+0

這是真的CONCAT只在2012年的作品? – 2013-03-07 00:57:48

+0

即時通訊使用它在MySQL 5沒有問題。此外,如果你不想使用該功能,只需以隱式方式進行。對於帶引號的字符串,可以通過將字符串放在一起來執行級聯: mysql> SELECT'My''S''QL'; - >'MySQL' – lemil77 2013-03-07 01:01:40

+0

我非常感謝你的幫助,但我使用的是SQL 2008 R2,並且concat不是內置函數。 – 2013-03-07 01:04:50

1

一種方法是使用動態SQL。這是將SQL生成爲一個字符串,然後執行它。

一個簡單的方法(可能)是使用like

where concat(', ', @IDS, ', ') like concat('%, ', id, ', %') 

需要注意的是,這把分離的開頭和表達式的結束,所以「10」不匹配「11010」。

0

1)顯示你的代碼。

2)您可能已嘗試將所有值作爲一個參數傳遞。這是行不通的。您必須將它們列爲單獨的參數,然後將它們作爲單獨的參數進行綁定。

是的,當in參數的數量可能更改時,這使得很難使用存儲過程。

相關問題