0

SQL ステートメントを動的に構築して実行するスクリプトを作成しようとしています。

これは、構築および保存される文字列です@strSQL(を使用して検証PRINT

UPDATE DNN_RSM_Exams 
SET ScoringDates = REPLACE(ScoringDates, '/2015', '/2016') 
WHERE SchoolYear = 2015

次のように変数を実行します。

EXECUTE (@strSQL)

ただし、次のエラーが表示されます。

nvarchar 値 'UPDATE DNN_RSM_Exams SET ScoringDates = REPLACE(ScoringDates, '/' をデータ型 int.

EXECUTE最初のスラッシュ (/) に当たると終了するようです。二重スラッシュ (//)、開き括弧 ([)、およびバックスラッシュ (\) を使用してエスケープしようとしました。機能した場合はありません。

誰でも私を助けてもらえますか?

更新 #01: 2015 年 8 月 17 日

最初に十分な情報を提供できなかったら申し訳ありません...

ScoringDates は NVARCHAR(MAX) フィールドです。

SQL ステートメントを構築するコードは次のとおりです。

SET @strSQL = 'UPDATE ' + @strTableName +
              ' SET ScoringDates = REPLACE(ScoringDates, ''/' + LTRIM(RTRIM(STR(@intSchoolYear_CopyFrom + 1))) + ''', ''/' + LTRIM(RTRIM(STR(@intSchoolYear_CopyFrom + 2))) + ''')' +
              ' WHERE SchoolYear = ' + LTRIM(RTRIM(STR(@intSchoolYear_CopyTo)))

ScoringDates は、INI 形式の文字列でデータを保持する文字列ベースのフィールドです。文字列で見つかった日付の年の部分を変更したいのですが、一致する可能性のある他の数字が誤って変更されるのを避けたいと考えています。したがって、「/YYYY」を別の「YYYY」値に置き換えることを具体的に検討しています。年の値の前にある「/」は、文字列内の別の数値ではなく、前置されるものが YEAR であることを確認するためのものです。

更新 #02: 2015 年 8 月 18 日

だから私は完全にびっくりしています...昨日、このスクリプトに何時間も頭をぶつけた後、私は敗北して家に帰りました。今日来て、PC を起動してスクリプトをもう一度実行すると、エラー メッセージが再び表示されます。うまくいきました。

SQL Management Studio でこれに遭遇したことはありませんが、SQL Management Studio が何らかの形で昨日ビー玉を失い、再起動が必要になった可能性はありますか? SQLはサーバーが直接処理していると思いました。サーバーに渡す前に最初にスタジオによって処理され、スタジオに「問題」があった場合、奇妙なエラーが発生する可能性がありますか?

いずれにせよ、ご意見をお寄せいただきありがとうございます。ホイールスピナーで申し訳ありません。再起動で問題が解決するとは思いもしませんでした。コードが間違っていると思っただけです。

4

1 に答える 1

0

「/」を「」に置き換えたい

したがって、setステートメントは次のようになります...

SET @strSQL = 'UPDATE DNN_RSM_Exams 
    SET ScoringDates = REPLACE(ScoringDates, ''2015'', ''2016'') 
    WHERE SchoolYear = 2015'

編集:あなたのコードは以下のコードとどう違うのですか? (これをもう一度編集して、後でクリーンアップします。コードはコメントに収まりません)

DECLARE @TableName TABLE (ScoringDates VARCHAR(100), SchoolYear INT)

DECLARE @strTableName VARCHAR(MAX)
DECLARE @intSchoolYear_CopyFrom VARCHAR(MAX)
DECLARE @intSchoolYear_CopyTo VARCHAR(MAX)

SET @strTableName = '@TableName'
SET @intSchoolYear_CopyFrom = '2009'
SET @intSchoolYear_CopyTo = '2010'

DECLARE @strSQL VARCHAR(MAX)

SET @strSQL = 'DECLARE @TableName TABLE (ScoringDates VARCHAR(100), SchoolYear INT); UPDATE ' + @strTableName +
              ' SET ScoringDates = REPLACE(ScoringDates, ''/' + LTRIM(RTRIM(STR(@intSchoolYear_CopyFrom + 1))) + ''', ''/' + LTRIM(RTRIM(STR(@intSchoolYear_CopyFrom + 2))) + ''')' +
              ' WHERE SchoolYear = ' + LTRIM(RTRIM(STR(@intSchoolYear_CopyTo)))

PRINT @strSQL

EXECUTE (@strSQL)
于 2015-08-17T17:12:02.433 に答える