Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak przekazać tablicę ciągów w parametrze SQL do klauzuli IN w SQL?

Wprowadzenie :Mimo że OP już zaakceptował odpowiedź, pomyślałem, że lepiej będzie podzielić się moim doświadczeniem, ponieważ wierzę, że podejście, które zamierzam pokazać, jest lepsze niż to zaakceptowane.

Uważam, że najlepszym sposobem przekazania tablic do bazy danych serwera sql jest użycie user defined table type i c# DataTable .W twoim przypadku, ponieważ chcesz przekazać tablicę ciągów o jednym wymiarze, jest to dość proste:

Najpierw musisz utworzyć typ tabeli zdefiniowany przez użytkownika w swojej bazie danych:

 CREATE TYPE dbo.StringArray As Table (
    StringItem varchar(50) -- you can use any length suited for your needs
)

Następnie musisz utworzyć tabelę danych w kodzie c#:

DataTable dt = new DataTable();
dt.Columns.Add("StringItem", typeof(System.String));

Następnie zmień procedurę składowaną, aby zaakceptować ten typ danych jako parametr:

ALTER proc [dbo].[sp_Accessories]
(  
@Mode varchar(50)=null,
@id int=null,
@brand varchar(50)=null,
@department varchar(MAX)=null,
@season varchar(50)=null,
@groupname varchar(MAX)=null,
@styles varchar(50)=null,
@combo dbo.StringArray Readonly=null, -- NOTE THIS CHANGE
@combo_color nvarchar(max)=null,
)
as
if @Mode='getsizewise'
begin
select Sizes,SUM(Quantity) from tbl_SizeBreakup where ([email protected]) and
([email protected]) and ([email protected]) and ([email protected]) and ([email protected]) 
and ([email protected]) and (Total_Add_Qty='Total Quantity') 
and comboColumn in(select StringItem from @Combo) -- NOTE THIS CHANGE
Group By Sizes
end

Następnie musisz przekonwertować tablicę ciągów na tabelę danych w kodzie c#.

foreach (string s in YourStringArray) {
    string[] temp = {s};
    dt.Rows.Add(temp);
}

Dodaj DataTable jako parametr do procedury składowanej:

System.Data.SqlClient.SqlParameter sp = new Data.SqlClient.SqlParameter();
sp.SqlDbType = SqlDbType.Structured;
sp.Value = dt;
sp.ParameterName = "@Combo";
cmd.Parameters.Add(sp);

Buduj i uruchamiaj.

Takie podejście powinno mieć lepszą wydajność niż użycie funkcji zdefiniowanej przez użytkownika sql, a także może być używane do różnych typów danych. jest to jeden z najlepszych powodów, aby go użyć:Rozważ scenariusz, w którym musisz przekazać tablicę dat:podejście csv wymaga, aby sql przekonwertowało każdy ciąg na datę, podczas gdy dzięki temu podejściu możesz po prostu przekazać daty w takiej postaci, w jakiej są, bez konwertowania ich na ciągi, a następnie z powrotem na daty. Możesz także przekazać tablicę 2 wymiarów lub słowniki, wszystko, co musisz zrobić, to utworzyć odpowiedni typ danych zdefiniowany przez użytkownika w swojej bazie danych sql.

Uwaga:kod napisany bezpośrednio tutaj, może być kilka literówek.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jakie są najlepsze praktyki dotyczące używania identyfikatora GUID jako klucza podstawowego, szczególnie w odniesieniu do wydajności?

  2. Jakie są ograniczenia programu SQL Server Compact? (Lub - jak wybrać bazę danych do użycia na platformach MS?)

  3. Wyzwalacz SQL Server:zrozumienie i alternatywy

  4. Konserwacja baz danych systemu SQL Server

  5. Jak wykorzystać zmienną do nazwy bazy danych w T-SQL?