在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'老师,医生'
我可以这样做吗?
答案 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
现在我可以传递像老师,医生这样的字符串值或数组,并且能够得到我想要的结果。