2012-05-15 2 views
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%'; 

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

+3

nchar versus varchar –

+0

Также ваш оператор вставки не работает, вы забыли кавычки вокруг этих строк или это было адаптировано из 'insert/select'? Также может сыграть роль сортировка - если сортировка чувствительна к регистру, '' Nancy 'LIKE' n% ''вернет false. –

+0

@ Митч, это хороший момент, но в худшем случае в этом конкретном случае он вводит неявные преобразования, а не изменяет результат. –

ответ

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%'; 

Гроздь других предложений, которые я бы упущением не упомянуть:

  • Вы должны всегда указывать префикс схемы при создании и вызова объектов. Таким образом, CREATE PROCEDURE dbo.wildcard_name, EXEC dbo.wildcard_name и т. Д.
  • Надеюсь, ваш производственный код не использует SELECT *.
  • Очень рекомендую использовать nvarchar вместо nchar для вашего параметра.
  • Оберните корпус процедуры с помощью BEGIN/END и не бойтесь использовать отступы, чтобы сделать его более читаемым.
  • Обычно вы хотите использовать SET NOCOUNT ON;, чтобы предотвратить сообщения n row(s) affected, мешающие вашим результатам.
  • NVARCHAR параметры должны иметь префикс N (хотя я смущен, почему вы чередуете между varchar и nchar в первую очередь - это две смены, где я ожидал бы нуля).
  • В зависимости от сортировки (и если вы хотите, чтобы поиск был чувствительным к регистру), вам может потребоваться изменить предложение where, используя предложение COLLATE.

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

enter image description here

+0

благодарит Аарона Бертран за ур ценные предложения. Но мой пост был просто для экономии места. Как из ответа ура я сделал EXEC dbo.wildcard_name N'n% '; но это не сработало. – nischal

+0

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

Смежные вопросы