在我的應用程序中,我想執行如下查詢:SELECT * FROM tbl WHERE col IN(@list)其中,@ list可以具有變量no的值。我正在使用MS SQL服務器數據庫。當我谷歌這個問題,後來我發現這個鏈接調用帶有表值參數的存儲過程
http://www.sommarskog.se/arrays-in-sql-2008.html
此鏈接說,使用表值參數。所以我使用Microsoft SQL Server Management Studio創建了用戶定義的數據類型。
CREATE TYPE integer_list_tbltype如表(正詮釋NOT NULL PRIMARY KEY)
然後寫存儲過程
CREATE PROCEDURE get_product_names @prodids integer_list_tbltype READONLY AS
SELECT p.ProductID, p.ProductName
FROM Northwind.dbo.Products p
WHERE p.ProductID IN (SELECT n FROM @prodids)
,然後使用管理工作室只有我執行這個程序
DECLARE @mylist integer_list_tbltype
INSERT @mylist(n) VALUES(9),(12),(27),(37)
EXEC get_product_names @mylist
它給我正確的輸出。但我想知道如何從Java源代碼中調用這個存儲過程。我知道如何調用簡單的存儲過程與恆定數量的參數
CallableStatement proc_stmt = null;
proc_stmt = con.prepareCall("{call test(?)}");
proc_stmt.setString(1,someValue);
但如何在表值參數情況下調用存儲過程?
謝謝@凱文。你知道任何解決方案,而不是使用TVP解決問題。 –
嗨Pranay,不客氣。檢查我的原始答案的建議。將分隔字符串作爲類型varchar(max)的單個參數傳遞。然後,在你的存儲過程中,調用SQL Server Split用戶定義的函數(你需要創建它,只需要搜索它,你會發現很多幫助)。 「分割」功能應該從分隔字符串中返回一個表格。祝你好運。 –
只需添加@ Kevin的有用答案,OP的原始鏈接就包含一個名爲「iter_intlist_to_tbl」的函數示例,以將varchar分割爲表變量(http://www.sommarskog.se/arrays-in-sql-2005的.html#迭代)!只是想我會提到它。 – DarthPablo