Передача в массив как переменные T-SQL - PullRequest
1 голос
/ 24 февраля 2012

Может кто-нибудь помочь мне превратить этот sql в сохраненный процесс ..

select * from voilets 
where cfrw = 'F16'
UNION 
(select * 
from voilets
where cfrw in ('B05','B12','R02','F01','F16','F17','U11','U03','U04','U21')) 
ORDER BY DSCA

Где 'F16 - это переменная с именем @default а также 'B05','B12','R02','F01','F16','F17','U11','U03','U04','U21' это массив @ voilets

Это не работает для меня:

@sCarrierSelect varchar(max)
AS
BEGIN

declare @SQL nvarchar(4000)

set @SQL = '

select * from voilets
where t_cfrw =  ' + @default + '
UNION 
(select * 
from carriers 
where t_cfrw in (' + @voilets+')) 
ORDER BY T_DSCA

'
print @SQL

exec sp_executesql @SQL


END

Ответы [ 4 ]

3 голосов
/ 24 февраля 2012

ЕСЛИ вы SQL Server IS > = 2008 тогда:

USE tempdb;
GO

CREATE TABLE voilets
    (cfrw char(3), DSCA int)
go
INSERT INTO voilets VALUES ('R02', 2)
INSERT INTO voilets VALUES ('F16', 5)
INSERT INTO voilets VALUES ('F16', 4)
INSERT INTO voilets VALUES ('X77', 9)
go
CREATE TYPE myType AS TABLE (id CHAR(3));
GO
CREATE PROCEDURE usp_myProc
    @default char(3),
    @voiletsTVP myType READONLY
    AS 
select * from voilets 
where cfrw = @default
UNION 
(select * 
from voilets
where cfrw in (SELECT * FROM @voiletsTVP)) 
ORDER BY DSCA
GO
-------------------------
DECLARE @default char(3)
SET @default='F16'
DECLARE @voiletsTVP AS myType;
INSERT INTO @voiletsTVP SELECT * FROM (VALUES ('B05'),('B12'),('R02'),('F01'),('F16'),('F17'),('U11'),('U03'),('U04'),('U21')) q(x)
EXEC usp_myProc @default,@voiletsTVP
GO

Результат-набор:

cfrw    DSCA
R02     2
F16     4
F16     5
1 голос
/ 26 февраля 2012

Вы можете узнать о Передаче массивов в параметрах SQL, используя тип данных XML в SQL Server 2005

См. Пример:

/* for this xml:
<list>
    <item>42</item>
    <item>73</item>
    <item>2007</item>
</list>
*/

CREATE FUNCTION [lm].[SplitList]
(
    @list AS XML
)
RETURNS TABLE
AS
RETURN
(
    SELECT tempTable.item.value('.', 'VARCHAR(MAX)') AS Item
    FROM @list.nodes('list/item') tempTable(item)
);
1 голос
/ 24 февраля 2012

Выполнить это безопасно в sproc на самом деле довольно сложно;Есть несколько распространенных подходов:

  • использовать udf для разделения строки на токене - google для "split udf" (их будет много) и объединить результаты
  • используйте табличный параметр

Лично я редко использую sprocs в наши дни;Я бы использовал dapper:

List<string> foo = ...
var items = conn.Query<SomeType>(
    "select * from [table] where colName in @foo", new { foo }).ToList();

У большинства провайдеров LINQ и ORM здесь тоже будут варианты, включая Contains и т. Д.

0 голосов
/ 26 февраля 2012

Почему бы не использовать функцию CLR sql для разделения ваших значений, передавая их в вашу процедуру. Вот очень хорошая и быстрая реализация разделенной строки: CLR Split String . Если вы не можете использовать sql clr, тогда поищите в сети «sql split string». Независимо от того, что вы используете, вы кладете результат этой работы во временную таблицу и присоединяете ее к своей основной таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...