Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL SERVER-包含列的WHERE语句中的用例_Sql Server - Fatal编程技术网

Sql server SQL SERVER-包含列的WHERE语句中的用例

Sql server SQL SERVER-包含列的WHERE语句中的用例,sql-server,Sql Server,例如,我有以下表格: tbl_EmpID ------------------ |EmployeeID|Group| |----------+-----| |100000001 |A | |100000002 |B | |100000003 |A | |100000004 |A | |100000005 |B | ------------------ SET NOCOUNT ON DECLARE @SQL varchar(600) SET @SQL = 'I

例如,我有以下表格:

tbl_EmpID
------------------
|EmployeeID|Group|
|----------+-----|
|100000001 |A    |
|100000002 |B    |
|100000003 |A    |
|100000004 |A    |
|100000005 |B    |
------------------
SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
现在我想创建一个具有两个参数的存储过程:@EmpFilter、@EmpList

SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
目标是根据以下内容筛选员工:

'All' - Show all clients
'Group A' - Show all clients in Group A
'Group B' - Show all clients in Group B
'Specific Clients' - Show specific clients from a list regardless if Group A or B
SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
我目前有以下问题:

SELECT * FROM tbl_EmpID
WHERE [Group] = CASE @EmpFilter
                WHEN 'All' THEN [Group]
                WHEN 'Group A' THEN 'A'
                WHEN 'Group B' THEN 'B'
                END
SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
而且效果很好。但是,如何实现第四个选项特定的客户

Problem 1: The CASE STATEMENT is  in [Group] column. It should be filtered based on the EmployeeID
Problem 2: Should not be "=".  How can I use the WHERE IN statement in filtering EmployeeID
Problem 3: The list of specific employees will be passed to the 2nd parameter (@EmpList) which is a single line string sparated by a semicolon. 
       Example: "100000001;100000003;100000004"
SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
请帮我解决这些问题。
提前感谢

您可以使用IF条件来实现这一点,使用动态SQL如下

SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
请注意,它没有经过测试,因为我目前没有SQL server,而sqlfiddle.com到目前为止对我来说已不可用。

据我所知,当@EmpFilter=特定客户端时,您希望通过@EmpList进行筛选

SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
您可以使用charindex像这样过滤EmployeeId

SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
SELECT * FROM tbl_EmpID
WHERE [Group] = CASE @EmpFilter
            WHEN 'Group A' THEN 'A'
            WHEN 'Group B' THEN 'B'                
            WHEN 'All' then [Group]
            END
    OR (      [Group] = 'Specific Clients'
         AND  Charindex(';'+ CAST(EmployeeID AS varchar(15)) + ';', ';'+ @EmpList + ';') > 0  
       )

您可以使用下面的存储过程来获得结果

SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
/*
    t3process 'a','by group'
    t3process 'all','all'
    t3process '100000001 ','by client'
*/

create proc t3process
(
    @EmpFilter nvarchar(100),
    @EmpList nvarchar(100)
)
as begin

if (@EmpFilter='all' and @EmpList='all')
begin
select * from t3
end 

else if(@EmpList='by group')
begin
select * from t3 where empgroup=@EmpFilter
end

else if(@EmpList='by client')
begin
select * from t3 where employeeid=@EmpFilter
end 

end
如果您没有得到结果,请告诉我。

您可以在以下情况下使用XML和另一种情况:

SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);

-请尝试下面的代码,它可能会对您有所帮助

SET NOCOUNT ON

DECLARE @SQL varchar(600)

SET @SQL = 
'IF (@EmpFilter != '''Specific Clients''') THEN
   SELECT * FROM tbl_EmpID
   WHERE [Group] = CASE @EmpFilter
        WHEN '''All''' THEN [Group]
        WHEN '''Group A''' THEN '''A'''
        WHEN '''Group B''' THEN '''B'''
        END;
ELSE
   SELECT * FROM tbl_EmpID
   WHERE EmployeeId IN (' + @EmpList +');
END IF';
EXEC(@SQL);
DECLARE @EmpFilter VARCHAR(100) = 'Group A'--Specific Clients
        ,@EmpList VARCHAR(100)

SELECT @EmpList = STUFF((
            SELECT DISTINCT ';' + CAST(EmployeeID AS VARCHAR(30))
            FROM tbl_EmpID
            FOR XML PATH('')
            ), 1, 1, '')

SELECT @EmpList AS SepartedEmpList;

DECLARE @CommaintoRow TABLE (
    ID VARCHAR(100)
    ,Val VARCHAR(100)
    ,Seq INT
    );

INSERT INTO @COmmaintoRow (ID,Val)
SELECT OtherID
    ,Split.a.value('.', 'VARCHAR(100)') AS Data
FROM (
    SELECT ROW_NUMBER() OVER (
            ORDER BY (SELECT NULL)) AS OtherID
        ,CAST('<M>' + REPLACE(@EmpList, ';', '</M><M>') + '</M>' AS XML) AS Data
    FROM tbl_EmpID
    ) AS A
CROSS APPLY Data.nodes('/M') AS Split(a);

IF @EmpFilter != 'Specific Clients'
BEGIN
    SELECT EmployeeID,[Group]
    FROM tbl_EmpID
    WHERE [Group] = (
            CASE @EmpFilter WHEN 'Group A' THEN 'A'
                WHEN 'Group B'  THEN 'B'
                WHEN 'All' THEN [Group]
                END
            )
END
ELSE
BEGIN
    SELECT * FROM tbl_EmpID WHERE EmployeeId IN (SELECT CAST(Val AS INT)FROM @COmmaintoRow
                                                        WHERE id = 1)
END

我很确定@employist中的EmployeeId不起作用。如果您使用动态sql,它肯定会起作用。例如,签出此链接,我知道它在动态sql上工作。但是你的不是动态sql:等等,我发布的是经过编辑的答案。虽然没有测试,但给出了一些解决方案的好主意。只是一个旁注。以这种方式设置存储过程不是很有效。如果先添加C组,然后添加D组,会发生什么情况。每次都必须对sp中的值进行硬编码是没有意义的。谢谢。我尝试了这种逻辑,它是有效的,但是在我的实际查询中完成执行需要花费太长的时间。因此,程序由于超时而出错。表中有索引吗?我想如果。。。正如@pankaj kumar singh所建议的那样。并读取参数嗅探问题。错误表示员工编号值溢出了int列。所以我将int改为varchar,没有返回任何内容。请帮助:EmployeeID列的类型是什么?使用相同的数据类型而不是int。我使用varchar,它必须是varchar,因为有员工ID上有字母。比如1000AA3 varchar列的大小?您需要将t.c.value'.'和'int'都更改为t.c.value'.'和'varcharsize_here'不必考虑后面的问题,它现在可以工作了。我修改了WHERE子句。非常感谢你。