在存储过程中传递两个不同的中文单词

时间:2015-10-05 04:19:54

标签: sql-server stored-procedures

在SQL Server中,我有一个表“a”,如下所示

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'老师,医生' 

我可以这样做吗?

3 个答案:

答案 0 :(得分:1)

Andreas Wederbrand给了您一个使用预准备语句的提示,但其语法不适用于 SQL Server (我假设 MySQL ?)。这就是 SQL Server 中的预处理语句的样子:

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

告诉我们是否有效。

答案 1 :(得分: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

答案 2 :(得分: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

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