Asp.net Sql Server 2005中需要的T-Sql帮助
我在tbluser表中创建了一个在5000个用户上运行的存储过程,数据库中有一些筛选条件。有4个筛选条件FC1、FC2、FC3、FC4。筛选条件有一些部门和国家的列表框和下拉列表。我希望输出如下所示:Asp.net Sql Server 2005中需要的T-Sql帮助,asp.net,sql-server-2005,stored-procedures,dynamic-sql,Asp.net,Sql Server 2005,Stored Procedures,Dynamic Sql,我在tbluser表中创建了一个在5000个用户上运行的存储过程,数据库中有一些筛选条件。有4个筛选条件FC1、FC2、FC3、FC4。筛选条件有一些部门和国家的列表框和下拉列表。我希望输出如下所示: ID Name StaffNo department Points 1 KK 111 dep1 2 2 NN 222 dep2 1 3 DD 333 dep3 4 我在结果集中得到了
ID Name StaffNo department Points
1 KK 111 dep1 2
2 NN 222 dep2 1
3 DD 333 dep3 4
我在结果集中得到了身份证,姓名,职员号,部门,但没有分数
点计算将基于过滤条件,如
如果FC1匹配用户得1分,如果FC1和FC2匹配用户都得2分,如果FC1、FC2和FC3匹配用户都得3分,依此类推
--in stored procedure i m using dynamic query
DECLARE @SQL VARCHAR(2000)
SET @SQL = 'SELECT U.UserID, U.StaffNo,U.FirstName+'' ''+ U.LastName AS EmployeeName,''?'' AS Points FROM tblUser U '
SET @SQL = @SQL+' WHERE U.Department in (' + @SqlDepartment + ') '
---------------------Update---------------------------------------
IF @SqlLanguage <> ''
SET @SQL = @SQL+' OR U.UserID IN (SELECT UserID FROM Country WHERE LCValues IN ('+ @SqlLanguage +') )'
IF @SqlAreas <> ''
SET @SQL = @SQL+' OR U.UserID IN (SELECT UserID FROM tblAreas WHERE '+@SqlAreas+')'
---------------------Update---------------------------------------
...other filtering condition
EXEC (@SQL)
所有过滤条件都是用OR逻辑实现的。我认为最好是在代码中计算出点,而不是在SQL中
我能想到的唯一方法是使用工会,这将是可怕的您是否尝试过使用案例陈述来计算分数
--in stored procedure i m using dynamic query
DECLARE @SQL VARCHAR(2000)
SET @SQL = '
SELECT
U.[UserID],
U.[StaffNo],
U.[FirstName]+'' ''+ U.[LastName] AS EmployeeName,
(
CASE WHEN EXISTS(SELECT 1 FROM [Country] WHERE /*Your filter comes in here*/) THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT 1 FROM [tblAreas] WHERE /*Your filter comes in here*/) THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT 1 FROM [OtherTable1] WHERE /*Your filter comes in here*/) THEN 1 ELSE 0 END +
CASE WHEN EXISTS(SELECT 1 FROM [OtherTable2] WHERE /*Your filter comes in here*/) THEN 1 ELSE 0 END
) AS Points
FROM [tblUser] U'
SET @SQL = @SQL+' WHERE U.Department in (' + @SqlDepartment + ') OR'...
...other filtering condition
EXEC (@SQL)
您可以使用左外部联接到筛选条件,按UserID分组以不获取重复项,为命中添加值1,并使用coalesce将无命中设置为0 一些示例代码显示了我使用地区和国家作为过滤条件的意思
declare @U table (UserID int, Name varchar(50), StaffNo char(3), department char(4))
declare @C table (CountryID int, UserID int)
declare @A table (AreaID int, UserID int)
insert into @U values (1, 'KK', '111', 'dep1')
insert into @U values (2, 'NN', '222', 'dep2')
insert into @U values (3, 'DD', '333', 'dep3')
insert into @C values(1, 1)
insert into @C values(2, 1)
insert into @C values(3, 2)
insert into @C values(3, 3)
insert into @A values(1, 1)
insert into @A values(2, 1)
insert into @A values(3, 2)
select
U.UserID,
U.Name,
U.StaffNo,
U.department,
coalesce(C.Point, 0)+coalesce(A.Point,0) as Points
from @U as U
left outer join
(select UserID, 1 as Point
from @C
-- where ...?
group by UserID) as C
on U.UserID = C.UserID
left outer join
(select UserID, 1 as Point
from @A
-- where ...?
group by UserID) as A
on U.UserID = A.UserID
感谢您提供解决方案。但是在我的例子中,FC1,2,3,4与4个不同的表相关,而不是tbluser表。您是否能够基于外键(可能是[UserID])加入这些表?你能举一个表格的例子,这样我就能给你一个更好的解决方案吗?我用一种快速的方法更新了我的答案,达到了你想要的效果。这是我能想出的最好的方法,没有看到更详细的表结构等等…谢谢你,伙计。太棒了。我得到了我所需要的解决方案。非常感谢。