-1

ストアド プロシージャを実行すると、次のエラーが発生します。

メッセージ 102、レベル 15、状態 1、行 6
'2011' 付近の構文が正しくありません。
(1 行が影響を受けます)

ストアド プロシージャは次のとおりです。

ALTER PROCEDURE [dbo].[DeliveryFileNames]
AS
BEGIN
    SET NOCOUNT ON;

    declare @SQL nvarchar(4000)

    Create Table #DelivTemp(
        Style nvarchar(50),
        Material nvarchar(50),
        Filename nvarchar(100),
        delivered_date date)

    set @SQL=
    N'insert into #DelivTemp
    Select distinct Style,Material,filename 
    from OPENQUERY(GCS_PRODUCTION,
    ''SELECT LEFT(FILENAME,locate(''''_'''',FILENAME)-1)as Style,
        substring_index(filename,''''_'''',2)as Material,filename,
        delivered_date FROM view_delivery_log
        where delivered_date > ''2011%'' order by Style '')'

    exec (@SQL)

    drop table dbo.DelivFN

    Select * into dbo.DelivFN
    from #DelivTemp

END

OpenQuery を使用して、SQL Server 2008 R2 上のリンク サーバーから SQL テーブルを更新しています。

\アンダースコアが本当の問題であることは知っていますが、、、および一重引用符と二重引用符の%両方を含む多数のオプションを試しました。

とにかく、私は同じ結果を得ています。ストアド プロシージャから独立してクエリを実行し、正しい結果を得ることができます。何度か参照されているファイル名フィールドはフォーマットされて00000000_ABC4_A.pngいます。アンダースコアを使用して、レポート目的で必要なファイル名のコンポーネントを識別しています。

4

3 に答える 3

5

%他の人が指摘した日付比較の論理エラーに加えて、現在の問題は構文エラーです。

別の動的SQLステートメント内に動的SQLステートメントが含まれているため...すべての一重引用符をダブルエスケープする必要があります...次の行を除いて、ほとんどのクエリでこれを行いました:

where delivered_date > ''2011%'' order by Style '')'

適切にエスケープすると、次のようになります。

where delivered_date > ''''2011%'''' order by Style '')'

疑問が生じます...ステートメントを直接呼び出すのではなく、動的に実行する文字列を作成するのはなぜですか?

于 2013-02-04T21:58:29.247 に答える
1

これは「2011%」の構文です。これは有効な日付ではありません。%がワイルドカードであるということは、コンパイラがWHERE句で何と比較するかを認識できないことを意味します。実際の日付を使用する必要があります。つまり、「2011_01_01」を使用して、コンパイラーが何と比較するかを認識できるようにします。

于 2013-02-04T21:52:44.660 に答える
0

ストアド プロシージャexecは別のセッションで実行されるため、一時テーブルにはアクセスできません。そのため、SQL ステートメントを実行しても問題ありません。いつでも使用できますYEAR(delivered_date) > 2011

別のアプローチは、リンク サーバーの fqn を使用して、一時テーブルを選択してバイパスすることです。

SELECT LEFT(FILENAME,locate('_',FILENAME)-1)as Style,
    substring_index(filename,'_',2)as Material,filename,delivered_date 
FROM [linked_server_name].[db_name].[dbo].view_delivery_log
into dbo.DelivFN
于 2013-02-04T21:55:38.883 に答える