2017-03-09 1 views
0

データベースにテーブルがほとんどなく、これらのテーブルのデータを格納するためにスカラーカーソルとテーブル変数を使用するAppoitmentIDに基づいて、 AppoitmentIDに基づいています。カーソルの終わりの後、カーソルの動的クエリを使用してデータを挿入したテーブル変数の行を数えます。カーソルを使用して必要なテーブルからすべての行を数えます

しかし、それは次のようなエラー

は、テーブル変数を宣言する必要があり、私を与える「@ProcCount」。

必要なテーブルからすべての行の数を取得する他の方法はありますか。 以下は私のコードです

Create FUNCTION [dbo].[ufn_GetProcedureCount] 
( 

) 
RETURNS INT 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @MenuID bigINT, @TableName VARCHAR(150);  
    DECLARE @Result int 
    DECLARE @ProcCount TABLE (AppID INT, WoundId bigINT,TableName varchar(150)); 

    DECLARE @sql nvarchar(2000) 
    DECLARE @Count int 


    DECLARE Cur_PendSign Cursor For 
     select Distinct MenuID,TableName from AppointmentTypeRequiredDocumnet A inner join Menu M on M.ID =A.MenuID where m.MenuGroupID = 8 

    OPEN Cur_PendSign 

    FETCH Cur_PendSign INTO @MenuID, @TableName 
    WHILE @@FETCH_STATUS=0 
    BEGIN 

SET @sql='DECLARE @ProcCount TABLE (AppID INT, WoundId bigINT,TableName varchar(150))' 
SET @[email protected]+'INSERT INTO @ProcCount (AppID,WoundId) 
      SELECT TOP 1 V.AppointmentID, 1 
      FROM ['[email protected]+'] V WITH(NOLOCK)' 
set @[email protected]+ 'select count(*) from @ProcCount;' 


--set @[email protected]+ 'DECLARE @Count int' 
EXECUTE sp_executesql @sql 

FETCH Cur_PendSign INTO @MenuID, @TableName 
    END 
CLOSE Cur_PendSign 
DEALLOCATE Cur_PendSign 


    --set @Result = select count(*) from @ProcCount 

    RETURN @Result 

END 
+0

が含まれているものを確認したい場合は、あなたがカーソルを必要とし、あなただけの加入で必要なものを達成することはできませんか?原因カーソルがパフォーマンスを低下させる – Pream

+0

@Pream、私は私のストアプロシージャで戻り値を使用するので、カーソルが必要です。 – Hitesh

+0

動的コード挿入から「TOP 1」のみを選択しています。すると、カーソルに表示されるテーブルの数は、その数だけです。そうじゃない? –

答えて

0

スクリプトには2つの問題があります。

まず:あなたはあなたが宣言カントとしてによるスコープの制限のために永続的なテーブルではなく、変数テーブルを作成する必要があります句

= 8

セカンド予定A.AppointmentIDは異なるmenuID属性、テーブル名を選択する場所の欠落変数テーブルをEXECの外部に置き、それを使用します。

+0

これは質問をするデモスクリプトです。持続的なテーブルを作成する方法と、このクエリで永続的なテーブルを使用する方法。 – Hitesh

+0

一時テーブル(## tablename)または通常のテーブルを使用します。 –

+0

一時テーブルはカーソルでは使用できないため、可変テーブルを使用します – Hitesh

0

このクエリはあなたに適しています。動的クエリを実行するには、sp_executesqlを使用する必要があります。 cursorを持たずに

CREATE FUNCTION [dbo].[ufn_GetProcedureCount] 
(

) 
RETURNS INT 
AS 
BEGIN 
    -- Declare the return variable here 
    DECLARE @Result INT 

    DECLARE @ProcCount TABLE (
     AppID INT, 
     WoundId BIGINT, 
     TableName VARCHAR(150) 
    ) 
    DECLARE @MenuID BIGINT, 
      @TableName VARCHAR(150) 

    --Get all table which I need to count rows 
    DECLARE Cur_PendSign CURSOR FOR 
    SELECT DISTINCT MenuID, TableName FROM Appointment WHERE AppointmentID = 8 
    OPEN Cur_PendSign 

    FETCH Cur_PendSign INTO @MenuID, @TableName 
    WHILE @@fetch_status = 0 
    BEGIN 

     -- Insert require data into @ProcCount using dynamic query 
     DECLARE @query VARCHAR(255) = 'INSERT INTO @ProcCount (AppID,WoundId,TableName) 
             SELECT TOP 1 AppointmentID, WoundId, TableName 
             FROM [' + @TableName + '] WITH(NOLOCK) ' 

     EXECUTE sys.sp_executesql @query 

     FETCH Cur_PendSign INTO @MenuID, @TableName 
    END 
    CLOSE Cur_PendSign 
    DEALLOCATE Cur_PendSign 

    --Get Count of all rows from tables 
    SELECT @Result = COUNT(*) FROM @ProcCount 

    RETURN @Result 

END 
+0

まだ動作していない同じエラーが発生する – Hitesh

+0

@Hitesh、SQL Server 2008で動作します。問題の明確な理解のために、SQL Serverから重大度と状態を受け取ったときに、テーブル定義、スクリプトの挿入、テストデータ、実際のエラーメッセージを追加してください。 – Venu

+0

@Vena、私はちょうど私のコードを更新しましたが、すべてのカーソルループは新しい変数テーブルを作成しましたので、カーソルの後に数えられません。 – Hitesh

0

Loopsあなたはダイナミック..

スキーマのコードでそれを行うことができます。

(それはあなたの実際のスキーマと異なる場合があります)

CREATE TABLE #Appointment (MENUID INT IDENTITY,AppointmentID INT, TableName VARCHAR(20)) 
INSERT INTO #Appointment 
SELECT 1,'TABLE1' 
UNION ALL 
SELECT 2, 'TABLE2' 
UNION ALL 
SELECT 8,'TABLE3' 
UNION ALL 
SELECT 8,'TABLE4' 
UNION ALL 
SELECT 8,'TABLE5' 

は以下のようになります

DECLARE @QRY VARCHAR(MAX)=''; 

SELECT @QRY = @QRY+ 'SELECT COUNT(1) AS COUNT_TABLES FROM '+ TableName + ' (NOLOCK) 
UNION ALL 
' FROM (
SELECT DISTINCT TableName FROM #Appointment A WHERE A.AppointmentID = 8 
)A 

SELECT @QRY = SUBSTRING(@QRY,1,LEN(@QRY)-11) 

SELECT @QRY = ' 
SELECT SUM(COUNT_TABLES) FROM (

' + @QRY+' 
)A' 

--PRINT @QRY 

EXEC (@QRY) 

あなたは@QRYが

/* 
SELECT SUM(COUNT_TABLES) FROM (

SELECT COUNT(1) AS COUNT_TABLES FROM TABLE3 (NOLOCK) 
UNION ALL 
SELECT COUNT(1) AS COUNT_TABLES FROM TABLE4 (NOLOCK) 
UNION ALL 
SELECT COUNT(1) AS COUNT_TABLES FROM TABLE5 (NOLOCK) 

)A 
*/ 
関連する問題