0

varcharデータベース内のすべての、nvarcharおよびntext列をループしてreplace、を使用してステートメントを実行しようとしてい@stringます。

ただし、フィールドの最大長が50しかない場合は、@shortstringのみを使用して置換ステートメントを実行する必要があります。以下のコードのように...

私がこれまでに持っているのは次のようなものです:

Declare @string varchar(100), @shortstring varchar(50)
Set @string = 'fullstring_100_characters'
Set @shortstring = 'shortstring_50_characters'

Update [Table] Set [Column] = Replace([Column],@string,'')

しかし、それがステートメントの場合ntext、ステートメントは次のようになり、常にの@string代わりにを使用します@shortstring

Update [Table] Set [Column] = CAST(REPLACE(CAST([Column] as NVarchar(MAX)),@string,'') AS NText)

誰かがこれを達成する方法を教えてもらえますか?

4

2 に答える 2

0

text または ntext フィールドを更新するには、 を使用する必要がありますUPDATETEXT。詳細情報については、以下のリンクを参照してください。

SQL Server で text/ntext または varchar(max) データ型の列を更新する

于 2012-08-01T13:58:55.830 に答える
0

まず、ntext フィールドを nvarchar(max) に置き換えるようお願いする必要があります。ntext は問題です

マイクロソフトからの引用

「ntext、text、および image データ型は、Microsoft SQL Server の将来のバージョンで削除されます。新しい開発作業でこれらのデータ型を使用することは避け、現在それらを使用しているアプリケーションを変更することを計画してください。nvarchar(max)、varchar(max) を使用してください。 )、代わりに varbinary(max) を使用します。

大規模な非 Unicode および Unicode 文字列とバイナリ データを格納するための固定長および可変長のデータ型。Unicode データは UNICODE UCS-2 文字セットを使用します。" 引用終了

データ型を変更する方法は次のとおりです。

alter table yourtable ALTER COLUMN colname varchar(max)

すべての表と列で説明したように、テキストを置き換えるスクリプトを次に示します。TABLE に計算列がある場合、スクリプトは少し泣き言を言いますが、それでも実行されます。

DECLARE @searchvalue varchar(100)
DECLARE @newvalue varchar(100)
DECLARE @newvalueShort varchar(50)
SET nocount off

SET @searchvalue = 'replace text'
SET @newvalue = 'new long text replacement'
SET @newvalueShort = 'short text'

SELECT * into #t FROM 
(
SELECT 'update [' + a.TABLE_name + '] 
SET ['+ column_name+ ']=replace(' +column_name +','''+@searchvalue +''','''+ case when character_maximum_length > 50 then @newvalue else @newvalueShort end + ''')
where [' +a.column_name+
'] like ''%'+@searchvalue +'%''' sqlstring
FROM INFORMATION_SCHEMA.COLUMNS a
join 
INFORMATION_SCHEMA.TABLES b
ON a.TABLE_name = b.TABLE_name
and b.TABLE_type = 'base TABLE'
WHERE data_type in ('varchar', 'char', 'nchar', 'nvarchar')
and character_maximum_length >= len(@newvalueShort)
) a

DECLARE @sqlstring as nvarchar(500)
DECLARE SqlCursor CURSOR FAST_FORWARD FOR
SELECT sqlstring FROM #t
OPEN SqlCursor
FETCH NEXT FROM SqlCursor
INTO @sqlstring
WHILE @@FETCH_STATUS = 0
BEGIN

     EXEC(@sqlstring)
     FETCH NEXT FROM SqlCursor
     INTO @sqlstring
END
CLOSE SqlCursor
DEALLOCATE SqlCursor
DROP TABLE #t
于 2012-08-01T14:27:12.227 に答える