如何使用Sql Server Management Studio执行窗口传递'IN'参数?

时间:2015-03-27 09:38:39

标签: 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 (@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   
  

更多解释。

这是我的桌子。

enter image description here

图片 - 1.0

这是我真正的问题。(如何正确地从此窗口添加'IN'值?

enter image description here 图片 - 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)。

enter image description here

图片 - 3.0

我想通过使用 SQL server management studio查询执行窗口(上面的窗口 - 图像2.0)

传递高亮文本(图像3.0)之类的参数

任何试图关闭此问题的人都必须以明确的理由发表评论。

3 个答案:

答案 0 :(得分:2)

这就是我的表现。它可能不是获得理想结果的最有效方式。

  1. 它创建一个来自CSV的临时表。
  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
    
    1. 如果找到其他 0
    2. ,以下函数将返回 1

      脚本

      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