1

SQL Server 2008 R2(T-SQL)を使用していて、動的SQLコードがあり、一時テーブルにデータを挿入しています。新しいクエリウィンドウまたはPRINTコードでコードを実行してから、新しいクエリウィンドウで実行すると、すべて問題ありませんが、ストアドプロシージャからこれを実行しようとすると、エラーがスローされます。

Msg 156, Level 15, State 1, Procedure users, Line 3
Incorrect syntax near the keyword 'FROM'.

で行を削除するとINSERT INTO #viewsTmp (webId, listId, viewName, viewTitle)、コードは正常に実行されます。同じストアドプロシージャ内に上記の同様のコードがあり、そのコードは問題ありません。

臨時雇用者テーブル:

CREATE TABLE #viewsTmp 
(
    webId uniqueidentifier,
    listId uniqueidentifier,
    viewName NVARCHAR(128),
    viewTitle NVARCHAR(255)
)

変数@databaseNameは、ストアドプロシージャのパラメータとして宣言されています

@databaseName NVARCHAR(255)

新しいクエリウィンドウでは問題ないが、ストアドプロシージャから実行された場合は問題ないコード:

SET @sql = N'
INSERT INTO #viewsTmp (webId, listId, viewName, viewTitle)
SELECT c.tp_WebId, c.tp_ID, b.LeafName, c.tp_Title
FROM (
    SELECT *
    FROM (
        SELECT [ListId], [LeafName], [Type], [WebId]
              ,ROW_NUMBER() OVER (PARTITION BY ListId ORDER BY DirName) AS RowNumber
          FROM ['+@databaseName+'].[dbo].[Docs]
          WHERE [LeafName] = ''users''
    ) AS a
    WHERE  [RowNumber] = 1 AND [Type] = 1
) AS b
INNER JOIN 
    (SELECT [tp_WebId], [tp_ID], [tp_Title] FROM ['+@databaseName+'].[dbo].[Lists]) 
    AS c 
    ON b.ListId = c.tp_ID AND b.WebId = c.tp_WebId

';
--PRINT @sql
exec sp_executesql @sql;

このコードの何が問題になっていますか?

4

1 に答える 1

1

Dale Burrell がアドバイスしたように、小さな変更を加えて、コードを段階的に分解および構成しました....コードは実行され、実行されません。それが何なのかわからなかった...そしてついに私は自分の間違いを発見した...

コード自体は問題ないのですが、コードの後に​​呼び出される内部プロシージャを呼び出すパラメータとして @webId を指定したところ、エラーが発生しました。すべての行に 1 つの webId がありましたが、正確に 1 つの行に別の行 (設計上の例外) があり、この 1 つの行に別の行と同じ webId を渡すと、このサブルーチンでエラーが発生しました。したがって、エラーメッセージは上記のコードではなく、呼び出されたプロシージャの一部のコードに対するものでした...

なんてこった…5時間…。

あらゆる点で、助けてくれてありがとう!今日、T-SQL のエラーについてもう 1 つ学びました。

于 2012-09-29T14:25:34.700 に答える