簡體   English   中英

如何將字符串數組傳遞給存儲過程?

[英]How to pass a string array like to stored procedure?

我正在使用 asp mvc c#,我想知道是否可以將我的字符串類數組傳遞給在存儲過程中操作的 IN。 我在下面有一個例子:

C#

string temp="123,234,234";

SQL:

@temp varchar(50)
Select * from table where column in @temp

它返回

Conversion failed when converting the nvarchar value '123,234,234' to data type int.

我想將 is 作為存儲過程傳遞,但現在迷路了從哪里開始。

我嘗試過的事情:

  1. 嘗試使用 Replace function 但仍然不起作用。

正如您所發現的,您不能這樣做,因為包含以逗號分隔的數字字符序列的字符串與包含以逗號分隔的常數的 SQL 程序不同。 例如,您不會期望這個 c# 工作:

int[] a =  new [] { 1,2,3 }; //works
int[] b =  "new [] { 1,2,3 }"; //doesn't work

您也不希望這個 IN 起作用(這實際上是您正在做的:

SELECT * FROM t WHERE x IN('1,2,3')

如果你的列是一個字符串,你不會得到一個錯誤,但它也不會像你期望的那樣工作

SELECT * FROM t WHERE x IN ('a','b'). --works
SELECT * FROM t WHERE x IN ('''a'',''b'''). --valid, but doesn't select x that are "a" or "b"

所以,總而言之,IN就像一個function取N個arguments各種類型。 它不會查看您傳遞的字符串並看到它有逗號並將它們分開


因此,您可以傳遞與項目一樣多的參數:

SELECT * FROM t WHERE x IN (@p1, @p2, @p3)

你的 sproc 有 3 個參數,你給每個參數一個值,如果你只尋找兩個數字,你只需重復最后一個數字,因為IN(1,2,2)IN(1,2)相同


或者你創建一個類型:

CREATE TYPE dbo.IntList AS TABLE 
(
      X INT NOT NULL
)

您聲明存儲過程以采用該類型的變量

@numList x

您在 c# 中聲明一個表示該類型的數據表

var dt = new DataTable();
dt.Columns.Add("X", typeof(int));

你用每行一個整數填充它

您將參數聲明為結構化

command.Parameters.AddWithValue("@numList", dt).SqlDbType = SqlDbType.Structured;

然后你執行它。 請記住,您的 @numList 是一個與其他任何表一樣的表,因此您不能說SELECT * FROM t WHERE x IN (@numlist) ,您可以執行SELECT * FROM t JOIN @numList n ON tx = nxSELECT * FROM t WHERE x IN (SELECT x FROM @numlist)

我正在使用 asp mvc c#,我想知道是否可以將像數組這樣的字符串傳遞給在存儲過程中操作的 IN。 我在下面有一個例子:

C#

string temp="123,234,234";

查詢語句:

@temp varchar(50)
Select * from table where column in @temp

它返回

Conversion failed when converting the nvarchar value '123,234,234' to data type int.

我想通過作為存儲過程,但現在迷失了從哪里開始。

我嘗試過的事情:

  1. 嘗試使用替換功能,但仍然不起作用。

暫無
暫無

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

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