Код ниже работает хорошо. Однако у меня есть проблемы с попыткой превратить его в подобное утверждение, с которым мне нужна помощь.
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 + %'''
Если ваш параметр хранимой процедуры равен @deliverer, а параметр динамического SQL — @pt, я считаю, что ваше выполнение sp_executesql должно присвоить параметру значение @pt = @deliverer. Что касается добавления подстановочных знаков, вы можете добавить их перед вызовом с помощью SET @deliverer = '%' + @deliverer + '%' или добавить их в динамический SQL с помощью SET @sql =@sql + ' and deliverer like ''%'' + @pt + ''%'''. Обратите внимание на двойные кавычки вокруг %. Переменная @pt не заключена в кавычки
Кроме того... вам нужно быть последовательным в использовании ваших типов данных varchar и nvarchar, иначе в какой-то момент вы получите затертые символы - либо в сопоставлении, либо в представлении.
@TN, это прекрасно. Рад принять ваш ответ, если вы опубликуете его как ответ.
@TN, что, если бы я хотел, чтобы предложение where проверяло несколько значений в столбце доставщика. сказать; WHERE deliverer LIKE ('%ichael%') OR deliverer LIKE ('%ohn%') OR deliverer LIKE ('%cristine%') как будут отформатированы SET @sql = и exec?
@KamikazeK - Как вы будете передавать несколько значений в свою хранимую процедуру? Будет ли это список, разделенный запятыми? Если это так, вам, вероятно, потребуется обновить динамический sql чем-то вроде AND EXISTS(SELECT * FROM STRING_SPLIT(@pt, '','') WHERE deliverer LIKE ''%'' + value + ''%'')'. (Обратите внимание на двойные кавычки вокруг запятой и подстановочного знака.) Я считаю, что для функции STRING_SPLIT() требуется SQL Server 2017 или более поздней версии.


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