簡體   English   中英

如何將PHP中作為參數的逗號分隔整數列表傳遞給SQL Server 2008中的存儲過程?

[英]How can I pass a comma-separated list of integers from PHP as a parameter to a stored procedure in SQL Server 2008?

希望我能以正確的方式解決這個問題,如果不是的話,我更願意學習如何做得更好。

我需要將一個逗號分隔的整數列表(總是正整數,沒有小數)傳遞給存儲過程。 然后,存儲過程將使用WHERE子句的IN運算符中的整數:

WHERE [PrimaryKey] IN (1,2,4,6,212);

前端是PHP並且通過ODBC建立連接,我嘗試將參數包裝在單引號中,並在列表到達查詢之前在存儲過程中將其過濾掉,但這似乎不起作用。

我得到的錯誤是:

將varchar值'1,2,4,6,212'轉換為數據類型int時轉換失敗。

我以前從未這樣做過,迄今為止的研究沒有取得任何積極成果。

首先,讓我們使用SQL函數來執行分隔數據的拆分:

CREATE FUNCTION dbo.Split
(
    @RowData nvarchar(2000),
    @SplitOn nvarchar(5)
)  
RETURNS @RtnValue table 
(
    Id int identity(1,1),
    Data nvarchar(100)
) 
AS  
BEGIN 
    Declare @Cnt int
    Set @Cnt = 1

    While (Charindex(@SplitOn,@RowData)>0)
    Begin
        Insert Into @RtnValue (data)
        Select 
            Data = ltrim(rtrim(Substring(@RowData,1,Charindex(@SplitOn,@RowData)-1)))

        Set @RowData = Substring(@RowData,Charindex(@SplitOn,@RowData)+1,len(@RowData))
        Set @Cnt = @Cnt + 1
    End

    Insert Into @RtnValue (data)
    Select Data = ltrim(rtrim(@RowData))

    Return
END

要使用它,您只需將函數傳遞給分隔字符串以及分隔符,如下所示:

SELECT
  *
FROM
  TableName
WHERE
  ColumnName IN (SELECT Data FROM dbo.Split(@DelimitedData, ','))

如果由於數據類型仍有問題,請嘗試:

SELECT
  *
FROM
  TableName
WHERE
  ColumnName IN (SELECT CONVERT(int,Data) FROM dbo.Split(@DelimitedData, ','))

您可以傳遞逗號單獨的值列表。 但是,您不能在in語句中使用它們。 你可以這樣做:

where ','+@List+',' like '%,'+PrimaryKey+',%' 

也就是說,您希望查看該值是否存在。 我正在使用SQL Server語法進行連接,因為問題標記為Microsoft。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM