Вопрос по – хранимая процедура с подстановочными параметрами

2

Я за столом

create table user (userId varchar(8) not null, userName varchar(8) not null)
   insert into user
     select 'NAME1','name1'
     union all
     select 'NAME2', 'name2'
     union all
     select 'NAME3','name3'

Я использовал хранимую процедуру для параметров подстановочных знаков как:

create procedure wildcard_name
@userName nchar(8)=  '%'
as
select * from user
where userName like @userName;

exec wildcard_name 'n%';

заявление exec не дает никакого результата, почему?

Также ваш оператор вставки не работает, вы забыли кавычки вокруг этих строк, или это было адаптировано изinsert/select? Сличение может также сыграть свою роль - если сопоставление чувствительно к регистру,'Nancy' LIKE 'n%' вернет ложь. Aaron Bertrand
нчар против варчар Mitch Wheat
@ Совсем неплохо, но в данном конкретном случае в худшем случае это приведет к неявным преобразованиям, а не к изменению результата. Aaron Bertrand

Ваш Ответ

1   ответ
3

что вызов exec теперь является частью тела вашей процедуры. Как насчет:

ALTER PROCEDURE dbo.wildcard_name
  @userName NVARCHAR(8) = '%'
AS
BEGIN
  SET NOCOUNT ON;

  SELECT userId, userName
    FROM dbo.user
    WHERE userName LIKE @userName;
END
GO -- <-- this is important! It tells SSMS that your procedure has ended!

EXEC dbo.wildcard_name N'n%';

Куча других предложений, которые я бы упустил, чтобы не упомянуть:

You should always specify the schema prefix when creating and calling objects. So CREATE PROCEDURE dbo.wildcard_name, EXEC dbo.wildcard_name, etc. Hopefully your production code does not use SELECT *. Highly recommend using nvarchar instead of nchar for your parameter. Wrap your procedure body with BEGIN / END and don't be afraid to use indenting to make it much more readable. You'll usually want to use SET NOCOUNT ON; to prevent n row(s) affected messages from interfering with your results. NVARCHAR parameters should have an N prefix (though I'm confused why you're alternating between varchar and nchar in the first place - this is two shifts where I'd expect zero). Depending on the collation (and whether you want the search to be case sensitive), you may need to change your where clause using the COLLATE clause.

EDIT мне кажется, это работает нормально, поэтому, пожалуйста, объясните, что вы делаете по-другому (и «не сработало», по-прежнему означает пустой результат или что-то еще?)

enter image description here

спасибо Аарону Бертрану за ваши ценные предложения. Но мой пост выше был просто для экономии места. Начиная с вашего ответа, я сделал EXEC dbo.wildcard_name N 'n%'; но это не сработало. nischal
Обновите ваш вопрос, указав фактический код, который вы использовали (получите его, используяSELECT OBJECT_DEFINITION(OBJECT_ID('dbo.wildcard_name'));, Если вы все еще используете оригиналcreate procedure код безGOЯ думаю, что вы на самом деле не вызываете хранимую процедуру, потому чтоEXEC стала частью тела хранимой процедуры. И, пожалуйста, не говорите расплывчатых / общих слов, таких как «это не сработало». Это похоже на ожидание определенного рецепта от врача, когда все, что вы сказали ему / ей, - это то, что вы чувствуете себя не очень хорошо. Или позвонив механику и сообщив ему, что ваш автомобиль "сломан".

Похожие вопросы