【解決方法】動的テーブル名を使用した SQL Server ストアド プロシージャ挿入ステートメント

プログラミングQA

[ad_1]

以下のようなストアドプロシージャがあります

CREATE PROCEDURE [dbo].[spInsert]
@name1 varchar(100),
@name2 varchar(100),
@Id int,
@LastUpdated datetime,
@Volume decimal
AS
BEGIN

declare @tableName varchar(100) = @name1 + '_' + @name2
INSERT INTO  [dbo]. [@tableName]
      ([ID],[LASTUPDATED],[VOLUME])
 VALUES( @Id , @LastUpdated , @Volume)
END

私の問題は、プロシージャ内のテーブル名がプロシージャ内で作成された変数であることです。 テーブル変数 @tableName を宣言する必要があると書かれています。

また、動的SQLを試しました(私がしたことが動的SQLであるかどうかはわかりません)のように

EXEC(' INSERT INTO  [dbo]. [' + @tableName + ']   
      ([ID],[LASTUPDATED],[VOLUME]) 
 VALUES( ' + @Id + ',' + @LastUpdated + ',' + @Volume + ')' )

これはエラーを示していませんが、レコードはテーブルに追加されていません。

誰かがこれを進める方法を私に知らせてくれたら素晴らしいでしょう.

ありがとう
ニシタ

[edit]SHOUTING を削除しました – OriginalGriff[/edit]

解決策 1

以下のように動的挿入ステートメントを変更してみてください

SQL
' INSERT INTO [dbo]. [' + @tableName + ']
([ID],[LASTUPDATED],[VOLUME])
VALUES( ' + cast(@Id as varchar(20)) + ',' + cast(@LastUpdated as varchar(30)) + ',' + cast(@Volume as varchar(30)) + ')' )

解決策 2

動的 SQL を作成するときに私が常に行うことの 1 つは、最初にそれを「印刷」して、それが何を生成しているかを確認することです。エラーを軽減する優れた方法です。 とにかく、それらの行に沿って次のようなことを試してください:

SQL
declare @Id int, @LastUpdated datetime, @Volume decimal
set @Id = 1
set @LastUpdated = getdate()
set @Volume = 10
declare @Sql nvarchar(max), @tableName nvarchar(100)
set @TableName = 'dummy'
set @Sql =
'insert into [dbo].' + @tableName + ' (Id, LastUpdated, Volume)
 values(' + convert(nvarchar, @Id) + ',''' + convert(nvarchar, @LastUpdated) + ''',' + convert(nvarchar, @Volume) + ')'
print @Sql
-- exec sp_executesql @Sql

準備ができたら exec のコメントを外し、明らかに、要件に関連する部分のみを使用してください。

解決策 3

返信が遅くなり申し訳ありません。 exec(@sql) を使用して実行する SQL クエリを作成中にエラーが発生しました。 日時データ (「LastUpdated」という名前の列) を引用符なしで挿入しようとしました (文字列 n 日付型データは、挿入のために引用符で囲む必要があります)。 私の手順がうまくいったことを修正したら。

返信ありがとうございます。上記の2つの回答は正しいように見えますが、問題が何であるかを見つけたので試しませんでした。

ニシタ

解決策 4

素敵な例、ありがとう..しかし、最後に挿入されたIDを取得して送信する方法はサンプルです

[ad_2]

コメント

タイトルとURLをコピーしました