0

こんにちは、はい、以前の質問と同じ人です...カーソル/SQLに関しては、私が作成した以下のストアドプロシージャ/カーソルを使用しています..コンパイルは適切に行われ、問題は私が実行しようとすると、次のエラーが発生します。

メッセージ 208、レベル 16、状態 1、行 1 無効なオブジェクト名 'DQM.dbo.ST_0043_BLANK_CONSENT_SAP_SIEBEL'。

(影響を受ける行は 0 行です) メッセージ 208、レベル 16、状態 1、行 1 無効なオブジェクト名 'DQM.dbo.ST_0044_CONSENT_SIEBEL_SAP_DIFF'。

(0 行が影響を受けます) メッセージ 208、レベル 16、状態 1、行 1 無効なオブジェクト名 'DQM.dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF'。

すべてを選択すると、行が返されるため、これらのオブジェクトがすべて存在することがわかりました。どんな助けでも大歓迎です。

    USE [Adhoc_datafix]
GO
/****** Object:  StoredProcedure [dbo].[CostTest_02]    Script Date: 01/10/2013 15:43:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
ALTER PROCEDURE [dbo].[CostTest_02]
AS
BEGIN

DECLARE @Issue_id int;
DECLARE @Master_id int;
DECLARE @Issue_table varchar(255);
DECLARE @price real;
DECLARE @rowcount bigint;
DECLARE @sql varchar(3000)


DECLARE cost_cursor cursor FOR
SELECT [Issue Id], [Master Issue Id], [Issue Table], [Price]
from Adhoc_datafix..[IssueTable]
FOR UPDATE OF [Issue Id];

OPEN cost_cursor;
FETCH NEXT FROM cost_cursor into @Issue_ID, @Master_id, @Issue_table, @Price

WHILE @@FETCH_STATUS = 0
BEGIN


SELECT @sql = 'Select count(*) from DQM.' + quotename(@Issue_table)
EXEC(@sql)
set @Rowcount = @@rowcount


UPDATE ADHOC_DATAFIX..[Issue Cost]
set [Issue Id] = @Issue_ID ,
    [Master Issue Id] = @Master_ID ,
    [Row Count] = @Rowcount,
    [Cost] = CAST(@Rowcount * @price as money)

--WHERE CURRENT OF cost_cursor;
FETCH NEXT FROM cost_cursor into @Issue_ID, @Master_id, @Issue_table, @Price
END

close cost_cursor;

DEALLOCATE cost_cursor;
END
4

1 に答える 1

1

問題はQUOTENAME()、スキーマとテーブル名を一緒に引用するために使用していることのようです。

select quotename('dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF')
-- returns [dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF]

[dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF]したがって、SQL Serverは、DQMスキーマで呼び出されたテーブルをクエリしようとしていると見なします。

select * from DQM.[dbo.ST_0045_CONSENT_SIEBEL_BANNER_DIFF]

しかし、本当にスキーマで呼び出さ[ST_0045_CONSENT_SIEBEL_BANNER_DIFF]れたテーブルをクエリする必要があります。dbo

select * from DQM.dbo.[ST_0045_CONSENT_SIEBEL_BANNER_DIFF]

これを修正するdbo.には、文字列の先頭からプレフィックスを削除してから@Issue_TableハードコーディングするDQMか、別のスキーマをサポートする場合PARSENAME()は、スキーマとテーブル名を別々に取得するために使用します。

SELECT @sql = 'Select count(*) from DQM.' + quotename(parsename(@Issue_table, 2)) + N'.' + quotename(parsename(@Issue_table, 1))

また、一般的な提案として、動的SQLを使用するときはいつでも、作成したクエリが本当に正しいかどうかを確認できるように、最後の文字列に簡単にアクセスできるようにしてください。PRINTSELECT

于 2013-01-10T16:23:29.593 に答える