Как в динамической функции

Код ниже работает хорошо. Однако у меня есть проблемы с попыткой превратить его в подобное утверждение, с которым мне нужна помощь.

CREATE PROCEDURE [dbo].[searcher]
    @deliverer nvarchar (100)
AS
BEGIN
    DECLARE @sql nvarchar(1000)

    SET @sql = 'SELECT location, deliverer, charger FROM Store where 1=1'

    IF (@deliverer IS NOT NULL)
        SET @sql = @sql + ' and deliverer =@pt'

    DECLARE @t1 as TABLE 
                   (
                       location varchar(1000), 
                       deliverer varchar(100), 
                       charger varchar(100)
                   )

    INSERT INTO t1
        EXEC sp_executesql @sql,
                N'@pt nvarchar(100)',
                @pt=location

    SELECT * FROM t1
END

До сих пор я пробовал код ниже, но без особого успеха

DECLARE @pt nvarchar (100)

SET @pt = '%' + @pt + '%'

IF (@deliverer IS NOT NULL)
    SET @sql = @sql + ' and deliverer like @pt'

Я также пробовал;

DECLARE @pt nvarchar (100)

IF (@deliverer IS NOT NULL)
    SET @sql = @sql + ' and deliverer like ''% + @pt + %'''

да, доставщик с опечаткой.мой плохой

Kamikaze K 18.03.2022 04:48

Если ваш параметр хранимой процедуры равен @deliverer, а параметр динамического SQL — @pt, я считаю, что ваше выполнение sp_executesql должно присвоить параметру значение @pt = @deliverer. Что касается добавления подстановочных знаков, вы можете добавить их перед вызовом с помощью SET @deliverer = '%' + @deliverer + '%' или добавить их в динамический SQL с помощью SET @sql =@sql + ' and deliverer like ''%'' + @pt + ''%'''. Обратите внимание на двойные кавычки вокруг %. Переменная @pt не заключена в кавычки

T N 18.03.2022 05:01

Кроме того... вам нужно быть последовательным в использовании ваших типов данных varchar и nvarchar, иначе в какой-то момент вы получите затертые символы - либо в сопоставлении, либо в представлении.

AlwaysLearning 18.03.2022 05:11

@TN, это прекрасно. Рад принять ваш ответ, если вы опубликуете его как ответ.

Kamikaze K 18.03.2022 05:16

@TN, что, если бы я хотел, чтобы предложение where проверяло несколько значений в столбце доставщика. сказать; WHERE deliverer LIKE ('%ichael%') OR deliverer LIKE ('%ohn%') OR deliverer LIKE ('%cristine%') как будут отформатированы SET @sql = и exec?

Kamikaze K 18.03.2022 12:23

@KamikazeK - Как вы будете передавать несколько значений в свою хранимую процедуру? Будет ли это список, разделенный запятыми? Если это так, вам, вероятно, потребуется обновить динамический sql чем-то вроде AND EXISTS(SELECT * FROM STRING_SPLIT(@pt, '','') WHERE deliverer LIKE ''%'' + value + ''%'')'. (Обратите внимание на двойные кавычки вокруг запятой и подстановочного знака.) Я считаю, что для функции STRING_SPLIT() требуется SQL Server 2017 или более поздней версии.

T N 18.03.2022 15:26
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
6
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если ваш параметр хранимой процедуры — @deliverer, а ваш динамический параметр SQL — @pt, я считаю, что ваше выполнение sp_executesql должно присвоить параметру значение @pt = @deliverer.

Что касается добавления подстановочных знаков, вы можете добавить их перед вызовом с помощью

SET @deliverer = '%' + @deliverer + '%'

или добавьте их в динамический SQL с помощью

SET @sql = @sql + ' and deliverer like ''%'' + @pt + ''%'''

Обратите внимание на двойные кавычки вокруг %. Переменная @pt не заключена в кавычки

Другие вопросы по теме