Sql server 如何使用Sql Server Management Studio执行窗口传递“IN”参数?
这是我的示例存储过程查询Sql server 如何使用Sql Server Management Studio执行窗口传递“IN”参数?,sql-server,tsql,ssms,Sql Server,Tsql,Ssms,这是我的示例存储过程查询 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 (@Locat
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'的正确方法是什么
但上面的查询不起作用
然后手动运行此查询映像-3.0
图像-3.0
我想通过使用window-Image 2.0上方的SQLServerManagementStudio查询执行窗口来传递参数,如HighlightText Image 3.0
任何试图结束这个问题的人,都必须有明确的理由进行评论。我就是这样做的。这可能不是达到预期效果的最有效方法 它从CSV创建一个临时表。 剧本 如果找到其他0,则以下函数将返回1 剧本 然后你可以像这样使用它
SELECT * WHERE [Searchifnotempty](@Location, Locatoin) = 1
您可以创建函数来拆分值,然后运行子查询:
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;
另一种方法是使用@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
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
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;
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