在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我将把一个字符串值(老师,医生) to @NTTYP传递到存储过程中,我想要的预期结果是
ID NAME_TYPE NAME
1 老师 甲
2 医生 乙
4 医生 丁但是我面临的问题是传递给存储过程的字符串值不能显示我想要的结果,下面是我的存储过程结果显示
@return_value = [dbo].[a_type]
@NCTTYP = N'老师,医生' 我可以这样做吗?
发布于 2015-10-05 14:14:08
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如果有效,请让我们知道。
发布于 2015-10-05 12:52:40
您需要在过程中创建一个准备好的语句,如下所示
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发布于 2015-10-06 10:16:30
我从一个解决我的问题的网站上找到了答案,链接是: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现在,我可以传入字符串值或像老师,医生这样的数组,并能够获得我想要的结果。
https://stackoverflow.com/questions/32941227
复制相似问题