2012-12-19 119 views
3

我有一個存儲過程如何通過項目作爲參數列表存儲過程

create PROCEDURE [dbo].[SP] 
(
    @OrderList varchar(500) 
) 
AS 
Begin 
    select * 
    from table 
    where id in ('+ @OrderList +') 

在這裏,我路過orderlist ....

當我執行這樣

exec sp 'iss005,iss006' 

我沒有收到數據

但是當我硬編碼像這樣...

select * from table where id in ('iss005','iss006') 

然後我得到的數據...

謝謝

+0

是 - 當然 - 什麼是你的問題? –

+2

當你對你的值進行「硬編碼」時,你在** IN子句中提供了**列表**。然而,當你傳遞你的參數時,你提供**只有一個字符串**,它恰好包含逗號分隔的文本 - 但它仍然只是一個單一的字符串 - ** NOT **字符串列表爲「IN」語句需要......您需要在答案中使用其中一種方法 - 將您的參數字符串變成**列表中的字符串列表** –

回答

5

不幸的是它不會這樣的。如果你改變你的程序,類似於以下,這將工作:

Create Procedure dbo.SP 
    @OrderList varchar(500) 
AS 

Declare @SQL VarChar(1000) 

Select @SQL = 'SELECT * FROM table ' 
Select @SQL = @SQL + 'WHERE id in (' + @OrderList +')' 

Exec (@SQL) 

GO 

尋找更多的到你的查詢,你的ID的價值varchar,所以程序會失敗,因爲你仍然可以得到:

WHERE id in (iss005,iss006)

當你想:

WHERE id in ('iss005','iss006')

你會甲腎上腺素編輯或者傳遞報價值,例如:

@OrderList = 'iss005','iss006'

或工作的一些SQL分裂@OrderList由逗號和使用QUOTENAME()功能引號添加到新的變量。

3

我強烈建議在這種情況下使用XML參數,會給你很大的靈活性。

你的XML可能是這樣的

<ids> 
    <id>iss006</id> 
    <id>iss005</id> 
</ids> 

你的程序應該是這樣的:

create PROCEDURE [dbo].[SP] 
(
    @OrderList XML 
) 
AS 
Begin 
    select * from table 
    where id in (
      select ParamValues.ID.value('.','VARCHAR(50)') 
        FROM @OrderList.nodes('/ids/id') as ParamValues(id) 
      ) 

除了使用存儲過程輸出的我也建議使用的功能,但是這是由你決定。 此致敬禮。

0

我有同樣的要求。我得到一個int列表變量的用戶列表,我需要獲得這些用戶的所有訂單。我使用了一個非常簡單的技巧來解決我的問題。請找到代碼。

public DataTable GetAllOrderData(List<int> UserID) 
    { 
     try 
     { 
      string listofuser = String.Join(",", UserID.ToArray()); 
      SqlParameter[] parameters = new SqlParameter[] 
      {     
       new SqlParameter("@USERID", listofuser) 
      }; 
      return SqlDBHelper.ExecuteParamerizedSelectCommand("GetOrderByUserID", System.Data.CommandType.StoredProcedure, parameters); 
     } 
     finally { UserID = null; } 

    } 

,這是該存儲過程

CREATE PROCEDURE [dbo].[GetOrderByUserID] (@USERID varchar(700)) 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 
Declare @SQL VarChar(1000) 
Select @SQL = 'SELECT *,ORM.OrganisationName FROM OrderTransaction ORT LEFT JOIN OrganisationMaster ORM ON (ORT.OrganisationID=ORM.OrganisationID) ' 
Select @SQL = @SQL + 'WHERE ORT.CreatedBy IN (' + @USERID +')' 

Exec (@SQL) 
END 
相關問題