Sql Server 2005中需要T-Sql帮助

时间:2011-03-07 11:13:55

标签: asp.net sql-server-2005 stored-procedures dynamic-sql

我创建了一个存储过程,在tbluser表中运行5000个用户,数据库中有一些过滤条件。有4个过滤条件(FC1,FC2,FC3,FC4)。过滤条件有一些ListBox和下拉列表的部门和country.I想要输出如下:

ID  Name  StaffNo  department Points
1   KK     111      dep1        2
2   NN     222      dep2        1
3   DD     333      dep3        4

我得到了ID,姓名,StaffNo,结果集中的部门而不是积分。

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

如果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逻辑实现。

3 个答案:

答案 0 :(得分:1)

您是否尝试过实施CASE语句来计算&#34; Points&#34;?

--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)

答案 1 :(得分:0)

我认为你可能会更好地解决代码中的点而不是SQL

我能想到的唯一方法是使用UNIONS,这将是非常可怕的

答案 2 :(得分:0)

您可以使用左外连接到您的过滤条件,按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