0

我有一个表,其中包含一个名为WhereClause

DECLARE @UserGroups TABLE (WhereClause nvarchar(1000), totalCount int)

该表已填充了一些值,WhereClause但没有为totalCount列填充。

一个例子WhereClause是“FirstName 为空”。

基本上对于表中的每一行,我需要从另一个表(用户)计算 COUNT(*) 并在totalCount上表中设置。

以下不起作用:

SELECT UG.WhereClause, U.TotalCount
FROM @UserGroups as UG
OUTER APPLY (SELECT COUNT(*) as 'TotalCount' FROM [Users] WHERE UG.WhereClause)
) U

我尝试创建一个 sql 函数并在函数中调用 exec sp_executesql 但它不受支持。

CREATE FUNCTION [dbo].[fn_UserGroupCount]
(   
    @whereClause as NVARCHAR(1000)
)
RETURNS @returnValue TABLE (TotalCount INT)
AS
BEGIN
    DECLARE @stmt nvarchar(1500)

    SET @stmt = 'SELECT COUNT(*) FROM [dbo].[Users]
    WHERE '  + @whereClause

    Exec sp_executesql @stmt

RETURN
END

SELECT * FROM [dbo].[fn_UserGroupCount]('Subject is null')

@UserGroups如前所述,如何填充我的表格?

谢谢

4

2 回答 2

3

试试这个,你必须使用动态 SQL 的临时表才能访问它(@UserGroups不起作用所以我用它替换了它#UserGroups):

CREATE TABLE #UserGroups (WhereClause nvarchar(1000), totalCount int)
INSERT #UserGroups VALUES ('FirstName IS NULL', NULL)
INSERT #UserGroups VALUES ('FirstName IS NOT NULL', NULL)

DECLARE @sql VARCHAR(8000) = STUFF(
(
SELECT  ';UPDATE #UserGroups SET totalCount = (SELECT COUNT(*) FROM [Users] WHERE ' + WhereClause + ') WHERE WhereClause = ''' + WhereClause + ''''
FROM    #UserGroups
FOR XML PATH('')
), 1, 1, '')

PRINT @sql
EXEC(@sql)

SELECT  *
FROM    #UserGroups

DROP TABLE #UserGroups

但是,如果WhereClause包含引号,可能会出现问题,例如FirstName LIKE 'Joe'.

于 2012-12-18T13:46:18.090 回答
0

我会使用游标来构建一个包含更新语句的字符串,其中包含内置的 @whereclause 中的 select count(*)。然后您可以执行它来执行更新。请参阅下面的 SQLFiddle:

已更新现在适用于 where 子句中包含单引号以及 where 子句中的撇号的地方

SQL小提琴

MS SQL Server 2008 架构设置

create table users
(
  userid int primary key identity,
  name varchar(50),
  subject varchar(50) null
);

INSERT INTO users (name, subject)
VALUES
    ('Fred', 'Maths'),
    ('Bill', null),
    ('Helen', 'English'),
    ('O''Keefe', 'Maths');

查询 1

DECLARE @WhereClause nvarchar(1000)
DECLARE @stmt nvarchar(1500) = ''

CREATE TABLE #UserGroups (WhereClause nvarchar(1000), totalCount int)
INSERT #UserGroups VALUES ('Subject IS NULL', NULL)
INSERT #UserGroups VALUES ('Subject IS NOT NULL', NULL)
INSERT #UserGroups VALUES ('Subject =''Maths''', NULL)
INSERT #UserGroups VALUES ('name =''O''''Keefe''', NULL)

DECLARE cur CURSOR FOR
  SELECT WhereClause FROM #UserGroups

OPEN cur

FETCH cur  INTO @WhereClause

WHILE @@FETCH_STATUS = 0
BEGIN

  SELECT @stmt = @stmt + 
      'UPDATE #UserGroups ' +
      'SET totalCount = ' +
      '(SELECT COUNT(*) FROM users WHERE ' + @WhereClause + ') ' +
      'WHERE WhereClause = ''' + REPLACE(@WhereClause, '''', '''''') + ''';' 
  FETCH cur  INTO @WhereClause
END

CLOSE cur
DEALLOCATE cur

--select @stmt
exec(@stmt)

SELECT *
FROM #UserGroups

DROP TABLE #UserGroups

结果

|         WHERECLAUSE | TOTALCOUNT |
------------------------------------
|     Subject IS NULL |          1 |
| Subject IS NOT NULL |          3 |
|    Subject ='Maths' |          2 |
|    name ='O''Keefe' |          1 |
于 2012-12-21T12:10:16.703 回答