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

exec語句不給予任何結果,爲什麼?

+3

nchar與varchar –

+0

此外,你的插入語句不起作用,你忘記了這些字符串引號,還是這是從'insert/select'改編的?整理也可能起作用 - 如果整理是區分大小寫的,''Nancy'LIKE'n%''將返回false。 –

+0

@Mitch這是一個很好的觀點,但在這種特殊情況下最糟糕的是它會引入隱式轉換,而不會改變結果。 –

回答

3

您是否嘗試再次運行它?我懷疑執行電話現在是你程序主體的一部分。如何:其他建議

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前綴(雖然我很困惑,爲什麼你在varcharnchar之間交替 - 這是我期望爲零的兩個轉變)。
  • 根據排序規則(以及是否希望搜索區分大小寫),可能需要使用COLLATE子句更改where子句。

編輯這似乎工作對我蠻好,所以請解釋一下你在做什麼不同(也「沒有工作」仍然意味着空的結果,還是其他什麼東西?):

enter image description here

+0

感謝Aaron Bertrand提供寶貴的建議。但我上面的帖子只是爲了節省空間。從你的答覆我做了EXEC dbo.wildcard_name N'n%';但它不起作用。 – nischal

+0

請用你使用的實際代碼來更新你的問題(使用'SELECT OBJECT_DEFINITION(OBJECT_ID('dbo.wildcard_name'));'。如果你仍然在使用原始的'create procedure'代碼而沒有'GO ',我認爲你實際上還沒有調用存儲過程,因爲'EXEC'已經成爲存儲過程體的一部分,請不要說含糊不清的/通用的東西,比如「它不起作用」。當你告訴他/她的所有信息都是你感覺不太好的時候,期待醫生給出特定的處方,或者打電話給技工,告訴他你的車「已經壞了」。 –