別の人が関連する定数を更新してからクエリを実行するだけでよい簡単に更新できるスクリプトを作成する SQL スクリプトを作成しようとしていますが、サブ選択で宣言された変数を使用すると問題が発生します。
これは、宣言された変数がサブ選択の範囲内にないためですが、回避策がないように見えるためです。
現在のコードは次のとおりです。
DECLARE @_logdb varchar(30) = 'nb_tablename';
DECLARE @_sitedb varchar(30) = 'nb_tablename_site';
DECLARE @_backtodate varchar(30) = '2012-10-10';
DECLARE @_sitename varchar(50) = 'bikehaven';
UPDATE
[@_sitedb].[dbo].[bike]
SET [bikeStatus] = 'active'
WHERE bikeID in (
SELECT
substring(
[event],
CHARINDEX('bike ID' , [event]) + LEN('bike ID '),
CHARINDEX(
')',
[event],
CHARINDEX('bike ID' , [event])
) - (CHARINDEX('bike ID' , [event]) + LEN('bike ID '))
) as 'ID'
from [@_logdb].[dbo].[logs]
where
user_name = 'john' AND
event_type = 'Deleted bike' AND
CHARINDEX('bike ID' , [event]) > 0 AND
date_time > @_backtodate AND
siteID = (
SELECT id
from [@_logdb].[dbo].[sites]
WHERE site_name = @_sitename
)
)
実際に問題を引き起こしている 2 つの変数は@_backtodate
&@_sitename
ですが、これらの変数を実際の文字列に置き換えると、それ[@_sitedb].[dbo].[bike]
も問題であるというエラーが表示されることもわかっています。
かなりのグーグル検索を行い、サブクエリに一時テーブルを使用し、SQL を変数自体として定義してからEXEC
コマンドを実行しようとしましたが、役に立ちませんでした。
編集:クエリ自体を宣言変数に引き出してから実行することで、Andomarの指示に従って変更を適用しました。 @_back to date
&の変数エラー@_sitename
。
解決策: Alexander Fedorenko によって提案された変更により、パズルの最後のビットが得られました。テーブル名は、実際の変数値に対して完全に機能する動的 SQL のパラメーターを介して明示的な置換として使用することはできません。
要するに: - クエリを文字列変数にします。- 発生する必要があるテーブル名の置換は、文字列連結を介して追加できます (つまり、出力文字列は有効なクエリである必要があります) - 置換用の変数パラメーターをストアド プロシージャに渡しますSP_executesql
最終的な作業コードは、Alexander Fedorenkoによって指定されたとおりです。