2015-10-05 53 views
0

在SQL Server中,我有一個表「一」爲遵循通在存儲過程中兩個不同的中國話

ID  NAME_TYPE  NAME 
1  老師   甲 
2  醫生   乙 
3  廚師   丙 
4  醫生   丁 

我創建了一個存儲過程

CREATE PROCEDURE [dbo].[a_type] 
    @NTTYP nvarchar(20) 
AS 
    SET NOCOUNT ON 
BEGIN 
    SELECT * 
    FROM a 
    WHERE NAME_TYPE IN (@NTTYP) 
END 

我將傳遞一個字符串值(老師,醫生)@NTTYP到存儲過程,和預期的結果我想是

ID  NAME_TYPE  NAME 
1  老師   甲 
2  醫生   乙 
4  醫生   丁 

但我面對的是字符串值傳遞給存儲過程不能顯示我想要的結果的問題,下面是我的存儲過程結果表明

@return_value = [dbo].[a_type] 
         @NCTTYP = N'老師,醫生' 

我能做到這一點呢?

+2

旁註:你應該** **不使用'sp_'前綴爲您的存儲過程。微軟已經保留了這個前綴以供自己使用(參見*命名存儲過程*)](http://msdn.microsoft.com/en-us/library/ms190669%28v=sql.105%29.aspx),以及你將來有可能冒着名字衝突的風險。 [這對你的存儲過程性能也是不利的](http://www.sqlperformance.com/2012/10/t-sql-queries/sp_prefix)。最好只是簡單地避免使用'sp_'並將其他內容用作前綴 - 或者根本沒有前綴! –

+0

你得到了什麼結果?請在問題中添加一個實際結果的例子。 – Paolo

回答

0

你需要創建一個準備好的聲明你的過程中,這樣的事情

CREATE PROCEDURE [dbo].[a_type] 
@NTTYP nvarchar(20) 

AS 
SET NOCOUNT ON 

BEGIN 
    PREPARE mySelect FROM 'SELECT * FROM a WHERE NAME_TYPE IN (?)'; 

    EXECUTE mySelect USING @NTTYP; 

    DEALLOCATE mySelect; 
END 
+0

我嘗試創建的過程中,存在錯誤顯示,附近有語法錯誤mySelect「,在這條線PREPARE mySelect FROM「SELECT * FROM一個WHERE NAME_TYPE IN(?)」; 我使用Microsoft SQL Server 2008 – Arzozeus

+0

對不起,看到了標籤「存儲過程」和剛剛就任的MySQL。太累了回答於是:) –

1

Andreas Wederbrand給你小費使用準備好的語句,但它的語法不是SQL服務器(我假設MySQL?)。這是如何聲明準備在SQL服務器樣子:

CREATE PROCEDURE [dbo].[a_type] 
(
    @NTTYP NVARCHAR(20) 
) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    BEGIN TRY 
     DECLARE @SQL NVARCHAR(4000) 
      , @SQLParams NVARCHAR(100); 

     SET @SQL = N' 
      SELECT ID 
       , NAME_TYPE 
       , NAME 
      FROM a 
      WHERE NAME_TYPE = @NTTYP'; 

     SET @SQLParams = N'@NTTYP NVARCHAR(20)'; 

     EXECUTE sp_executesql @SQL, @SQLParams, @NTTYP; 
    END TRY 
    BEGIN CATCH 
     SELECT ERROR_NUMBER(), ERROR_MESSAGE(); 
    END CATCH 
END 

讓我們知道,如果它的工作原理。

+0

感謝您的幫助,有錯誤必須聲明標量變量「@NTTYP」。 – Arzozeus

+0

對不起,忘了添加一行。現在試試! –

+0

返回空行,結果如下: DECLARE \t return_value int EXEC \t return_value = [dbo]。[a_type] \t \t NTTYP = N '老師,醫生' 選擇\t '返回值'= RETURN_VALUE – Arzozeus

0

我發現從一個網站,解決我的問題的答案,鏈接是: http://sqlmag.com/t-sql/passing-multivalued-variables-stored-procedure

然後我下面重現我的存儲過程:

CREATE PROCEDURE [dbo].[a_type] 
@NTTYP nvarchar(20) 
AS 
SET NOCOUNT ON 
BEGIN 
SELECT * 
FROM a 
WHERE CHARINDEX(',' + NAME_TYPE + ',', ',' + @NTTYP + ',') > 0 
END 

現在我可以將字符串值傳遞或像老師,醫生這樣的陣列,並且能夠得到我想要的結果。

相關問題