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子句。非常感谢你。