Asp.net Sql Server 2005中需要的T-Sql帮助

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 我在结果集中得到了

我在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
我在结果集中得到了身份证,姓名,职员号,部门,但没有分数

点计算将基于过滤条件,如

如果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])加入这些表?你能举一个表格的例子,这样我就能给你一个更好的解决方案吗?我用一种快速的方法更新了我的答案,达到了你想要的效果。这是我能想出的最好的方法,没有看到更详细的表结构等等…谢谢你,伙计。太棒了。我得到了我所需要的解决方案。非常感谢。