Я пытаюсь выполнить процедуру хранилища, но не могу получить из нее данные. Ниже приведена процедура хранения.

USE test
GO
CREATE PROCEDURE SELECT_IDs @idList nvarchar(1750)
AS
BEGIN TRY
SELECT DISTINCT child FROM example WHERE parent IN (@idList)
UNION
SELECT DISTINCT parent FROM example WHERE child IN (@idList)
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber;
END CATCH
GO

EXEC SELECT_IDs @idList = ['100','101'];

После выполнения вышеупомянутой процедуры он не дает мне данных, где, как если бы я выполнял тот же запрос выбора, он дает мне данные.

SELECT DISTINCT child FROM example WHERE parent IN ('100','101')

После прочтения комментариев я попробовал приведенный ниже код, но не работал.

/*
Splits string into parts delimitered with specified character.
*/
CREATE FUNCTION [dbo].[SDF_SplitString]
(
@sString nvarchar(2048),
@cDelimiter nchar(1)
)
RETURNS @tParts TABLE ( part nvarchar(2048) )
AS
BEGIN
if @sString is null return
declare @iStart int,
        @iPos int
if substring( @sString, 1, 1 ) = @cDelimiter 
begin
    set @iStart = 2
    insert into @tParts
    values( null )
end
else 
    set @iStart = 1
while 1=1
begin
    set @iPos = charindex( @cDelimiter, @sString, @iStart )
    if @iPos = 0
        set @iPos = len( @sString )+1
    if @iPos - @iStart > 0          
        insert into @tParts
        values  ( substring( @sString, @iStart, @iPos-@iStart ))
    else
        insert into @tParts
        values( null )
    set @iStart = @iPos+1
    if @iStart > len( @sString ) 
        break
end
RETURN
END

И изменил хранимую процедуру на

USE test
GO
CREATE PROCEDURE SELECT_IDs @idList nVarchar(2048)
AS
BEGIN TRY
SELECT DISTINCT child FROM example WHERE parent IN ([dbo].[SDF_SplitString] 
('@idList',',')) or child IN ([dbo].[SDF_SplitString]('@idList',','))
UNION
SELECT DISTINCT parent FROM example WHERE parent IN ([dbo].[SDF_SplitString] 
(@idList,',')) or child IN ([dbo].[SDF_SplitString](@idList,','))
END TRY
BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber;
END CATCH
GO

Но возникает проблема: не удается найти ни столбец «dbo», ни пользовательскую функцию, ни агрегат «dbo.SDF_SplitString», либо имя неоднозначно.

0
Pawan Kumar 28 Май 2018 в 12:50

1 ответ

Лучший ответ

Если вы используете SQL Server 2016 и более поздние версии, попробуйте использовать STRING_SPLIT

USE test GO
    CREATE PROCEDURE SELECT_IDs @idList nvarchar(1750) AS BEGIN TRY
    SELECT DISTINCT child
    FROM example
    WHERE parent IN
        (SELECT value
         FROM STRING_SPLIT(@idList, ','))
    UNION
    SELECT DISTINCT parent
    FROM example
    WHERE child IN
        (SELECT value
         FROM STRING_SPLIT(@idList, ',')) END TRY BEGIN CATCH
    SELECT ERROR_NUMBER() AS ErrorNumber; END CATCH 
GO

EXEC SELECT_IDs @idList = '100,101';

ОБНОВЛЕНИЕ 1.0 - функция интегрирования для разделения

Измените STORED PROCEDURE, как указано ниже. Похоже, вы пропустили предложение SELECT для вызова функции.

USE test GO
CREATE PROCEDURE SELECT_IDs @idList nVarchar(2048) AS BEGIN TRY
SELECT DISTINCT child
FROM example
WHERE parent IN (SELECT * FROM SDF_SplitString(@idList, ','))
  OR child IN (SELECT * FROM SDF_SplitString(@idList, ','))
UNION
SELECT DISTINCT parent
FROM example
WHERE parent IN (SELECT * FROM SDF_SplitString(@idList, ','))
  OR child IN (SELECT * FROM SDF_SplitString(@idList, ',')) END TRY BEGIN CATCH
SELECT ERROR_NUMBER() AS ErrorNumber; END CATCH GO
1
Suresh Prajapati 31 Май 2018 в 06:26