2015-10-05 77 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 

现在我可以将字符串值传递或像老师,医生这样的阵列,并且能够得到我想要的结果。

相关问题