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