这是我的示例存储过程查询。
CREATE PROCEDURE EMP_Details
@EmpType varchar(6),
@Location varchar(55)
AS
BEGIN
SET NOCOUNT ON;
SELECT EmpName,EmpAge,EmpOrgCode FROM Employee WHERE EmpType = @EmpType AND Locatoin IN (@Location)
END
当我尝试通过 SSMS 执行它时。我想将'IN'
参数传递给 SMSS 查询执行器。传递值的正确方法是什么进入'IN'
参数('@Location'
)
DECLARE @return_value int
EXEC @return_value = EMP_Details
@EmpType = N'FUL',
@Location = N'CY,CA,NY,WA' -- <<this is not work for me
SELECT 'Return Value' = @return_value
更多解释。
这是我的桌子。
图片 - 1.0
这是我真正的问题。(如何正确地从此窗口添加'IN'
值?)
图片 - 2.0
之后 SSMS 创建此查询。
USE [test]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[EMP_Details]
@EmpType = N'A',
@Location = N'CY,NY'
SELECT 'Return Value' = @return_value
GO
但以上查询无法正常工作
然后手动运行此查询(Image - 3.0)。
图片 - 3.0
我想通过使用 SQL server management studio查询执行窗口(上面的窗口 - 图像2.0)
传递高亮文本(图像3.0)之类的参数任何试图关闭此问题的人都必须以明确的理由发表评论。
答案 0 :(得分:2)
这就是我的表现。它可能不是获得理想结果的最有效方式。
脚本
CREATE FUNCTION [ConvertCSVToTbl] ( @list NVARCHAR(MAX) )
RETURNS @tbl TABLE ( ID INT NOT NULL )
AS
BEGIN
DECLARE @pos INT ,
@nextpos INT ,
@valuelen INT
SELECT @pos = 0 ,
@nextpos = 1
WHILE @nextpos > 0
BEGIN
SELECT @nextpos = CHARINDEX(',', @list, @pos + 1)
SELECT @valuelen = CASE WHEN @nextpos > 0 THEN @nextpos
ELSE LEN(@list) + 1
END - @pos - 1
INSERT @tbl(ID)
VALUES (CONVERT(INT, SUBSTRING(@list, @pos + 1, @valuelen)))
SELECT @pos = @nextpos
END
RETURN
END
GO
脚本
CREATE FUNCTION [SearchIfNotEmpty]
(
@list NVARCHAR(MAX) ,
@ID INT
)
RETURNS BIT
AS
BEGIN
IF ( @list IS NULL )
RETURN 1
IF EXISTS ( SELECT *
FROM [ConvertCSVToTbl](@list)
WHERE id = @ID )
BEGIN
RETURN 1
END
RETURN 0
END
GO
然后你可以像
一样使用它SELECT * WHERE [Searchifnotempty](@Location, Locatoin) = 1
答案 1 :(得分:0)
您可以创建分割值的函数,然后运行子查询:
CREATE FUNCTION dbo.SplitString(@List nvarchar(max), @Delimiter nvarchar(1))
RETURNS @returns TABLE (val nvarchar(max), [level] int, PRIMARY KEY CLUSTERED([level]))
AS
BEGIN
;WITH cte AS
(
SELECT SUBSTRING(@List, 0, CHARINDEX(@Delimiter, @List + @Delimiter)) AS val,
CAST(STUFF(@List + @Delimiter, 1, CHARINDEX(@Delimiter, @List + @Delimiter), '')
AS nvarchar(max)) AS stval,
1 AS [level]
UNION ALL
SELECT SUBSTRING(stval, 0, CHARINDEX(@Delimiter, stval)),
CAST(STUFF(stval, 1, CHARINDEX(@Delimiter, stval), '') AS nvarchar(max)),
[level] + 1
FROM cte
WHERE stval != ''
)
INSERT @returns
SELECT REPLACE(val, ' ','' ) AS val, [level]
FROM cte
WHERE val > ''
RETURN
END;
CREATE PROCEDURE dbo.EMP_Details
@EmpType varchar(6),
@Location varchar(55)
AS
BEGIN
SELECT EmpName,EmpAge,EmpOrgCode FROM Employee
WHERE EmpType = @EmpType AND Locatoin IN
(SELECT val FROM dbo.SplitString(@location, ','))
END;
答案 2 :(得分:0)
另一种方法是使用@Locations xml参数,等待你避免使用函数,见下文
EXEC @return_value = EMP_Details
@EmpType = N'FUL',
@Locations = N'<Locations><Location Name="CY"/><Location Name="CA"/><Location Name="CN"/></Locations>'
-----Store Procedure--------------
CREATE PROCEDURE EMP_Details(
@EmpType varchar(6),
@Locations xml
)
AS
BEGIN
SET NOCOUNT ON;
SELECT EmpName,EmpAge,EmpOrgCode FROM Employee WHERE EmpType = @EmpType
AND Locatoin IN (SELECT Locations.Node.value('@Name', 'VARCHAR(50)')
FROM @Locations.nodes('/Locations/Location') Locations(Node))
END