T-SQL: концепция, аналогичная C # params - PullRequest
1 голос
/ 30 октября 2009

Разрешает ли T-SQL переменное число аргументов для хранимой процедуры, например params в C #?

РЕДАКТИРОВАТЬ : Я использую SQL Server 2005. Этот ответ 2008 года заставляет меня желать, чтобы мы его использовали ...

Ответы [ 5 ]

3 голосов
/ 30 октября 2009

В SQL 2008 есть табличные параметры (TVP)

Ваш сохраненный процесс может принимать списки параметров.

Наконец, мы можем сделать предложение IN, не полагаясь на XML!

Mike

2 голосов
/ 30 октября 2009

Нет, не для таких вещей, как UDF или хранимые процедуры. Вот для чего нужны столы. Поместите значения в таблицу где-нибудь (с общим ключом) и передайте правильный ключ к вашей процедуре.

1 голос
/ 30 октября 2009

Обычно

CREATE PROCEDURE dbo.sptest 
( @xml TEXT )
AS 
BEGIN
DECLARE @flag1 INT
DECLARE @flag2 VARCHAR(50)
DECLARE @flag3 DATETIME

DECLARE @idoc INT
exec sp_xml_preparedocument @idoc OUTPUT, @xml

SELECT @flag1 = firstparam, flag2 = secondparam, flag3 = thirdparam
FROM OPENXML(@idoc, '/root', 2) WITH
( firstparam INT, secondparam VARCHAR(50), thirdparam DATETIME) as x

END


exec sptest '<root><firstparam>5</firstparam><secondparam>Joes Bar</secondparam><thirdparam>12/30/2010</thirdparam></root>'

Удлинение при необходимости

0 голосов
/ 30 октября 2009

Я использовал небольшую функцию для разделения строки CSV в таблицу

Так я мог бы пойти

SELECT col1, col2
FROM myTable
WHERE myTable.ID IN (SELECT ID FROM dbo.SplitIDs('1,2,3,4,5...'))

Моя функция ниже:

CREATE FUNCTION [dbo].[SplitIDs]
(
    @IDList varchar(500)
)
RETURNS 
@ParsedList table
(
    ID int
)
AS
BEGIN
    DECLARE @ID varchar(10), @Pos int

    SET @IDList = LTRIM(RTRIM(@IDList))+ ','
    SET @Pos = CHARINDEX(',', @IDList, 1)

    IF REPLACE(@IDList, ',', '') <> ''
    BEGIN
        WHILE @Pos > 0
        BEGIN
            SET @ID = LTRIM(RTRIM(LEFT(@IDList, @Pos - 1)))
            IF @ID <> ''
            BEGIN
                INSERT INTO @ParsedList (ID) 
                VALUES (CAST(@ID AS int)) --Use Appropriate conversion
            END
            SET @IDList = RIGHT(@IDList, LEN(@IDList) - @Pos)
            SET @Pos = CHARINDEX(',', @IDList, 1)

        END
    END 
    RETURN
END

Я уверен, что есть лучшие способы реализовать это, это один из способов, который я нашел в Интернете, и он хорошо работает для того, что я делаю. Если есть какие-то улучшения, пожалуйста, прокомментируйте.

0 голосов
/ 30 октября 2009

Другой подход, который я видел для передачи параметров или массивов, - это передать строку XML, вывести ее во временную переменную таблица / таблица и работать с ней с этого момента. Не самый простой способ, когда вы хотите вручную запустить хранимую процедуру, но она работает как обходной путь к отсутствию поддержки массивов / динамических параметров.

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