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 ステートメントが結果を返さないのはなぜですか?

4

1 に答える 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%';

私が言及しないことを怠っている他の提案の束:

  • オブジェクトを作成して呼び出すときは、常にスキーマ プレフィックスを指定する必要があります。だからCREATE PROCEDURE dbo.wildcard_nameEXEC dbo.wildcard_nameなど。
  • うまくいけば、あなたの製品コードは を使用しませんSELECT *
  • パラメータには nchar ではなく nvarchar を使用することを強くお勧めします。
  • プロシージャ本体をBEGIN/ENDで囲み、読みやすくするためにインデントを使用することを恐れないでください。
  • 通常は、メッセージが結果に干渉しSET NOCOUNT ON;ないようにするために使用します。n row(s) affected
  • NVARCHARvarcharパラメーターには N プレフィックスが必要です (ただし、最初にとを交互に使用する理由がわかりません。ncharこれは 2 つのシフトであり、ゼロと予想されます)。
  • 照合 (および検索で大文字と小文字を区別するかどうか) によっては、句を使用して where 句を変更する必要がある場合がありますCOLLATE

編集これは私にとってはうまくいくようですので、あなたが違うことをしていることを説明してください(そして、「うまくいかなかった」ということはまだ空の結果、または何か他のことを意味しますか?):

ここに画像の説明を入力

于 2012-05-15T13:07:12.177 に答える