0

という名前の列を含むテーブルがありますWhereClause

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

テーブルにはいくつかの値が入力されていますが、列には何も入力されてWhereClauseいません。totalCount

その例は、WhereClause「FirstName が null です」です。

基本的に、テーブルの各行について、別のテーブル (Users) から 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

カーソルを使用して、select count(*) from @whereclause を組み込んだ更新ステートメントを含む文字列を作成します。これを実行して、更新を実行できます。以下の SQLFiddle を参照してください。

UPDATED 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 に答える