0

文字「。」を削除する必要がある状況があります。特定のテーブルの一意性制約を持つ VARCHAR から。カスタム アプリケーション コードよりも SQL でこれを行うことをお勧めします。変更を行うロジックはありますが、VARCHAR の一意性制約を克服する方法に苦労しています。

これが私のテストテーブルです:

CREATE TABLE [dbo].[TableName] (
    [TableNameID]   INT           IDENTITY (1, 1) NOT NULL,
    [TableInfo]     VARCHAR (128) NOT NULL,
    CONSTRAINT [unq_TableName] UNIQUE NONCLUSTERED ([TableInfo] ASC)
)

(一意性制約を処理せずに) 置換を行うためのロジックは次のとおりです。

UPDATE TableName
SET TableInfo = REPLACE(TableInfo, '.', '_')
WHERE TableInfo LIKE '%.%'

次のデータセットで作成したテストを克服しようとしています:

TableNameID | TableInfo
-------------------------
     1      |  Test
     2      |  Test.
     3      |  Test_
     4      |  Test__

これについての助けをいただければ幸いです。

4

4 に答える 4

0

このコードは、更新する行の PK がわかっている場合に機能します:-

declare @unique varchar(50)
set @unique = ''

while 1=1 begin
    set @unique+='_'
    update t set 
        t.TableInfo = replace(t.TableInfo, '.', @unique)
    from dbo.tablename t
    where t.TableNameID=2 --t.tableinfo like '%.%'
    and not exists(
        select *
        from dbo.TableName csq
        where csq.TableInfo = replace(t.TableInfo, '.', @unique)
    )
    if @@rowcount=1
        break
end

コードは壊れやすく、たとえば、TableInfo 列の幅が不十分で、複数のアンダースコアを追加して一意のキーを作成できない場合、失敗します。

更新が必要な行のレコードセット上でカーソルを列挙し、PK ごとにこのコードを呼び出すのは簡単です (または、UDF に変換して で呼び出しますcross apply)。

どのようにセットベースで機能させるかをもっと考えなければなりません。少し寝たら違う答えが返ってくるかもしれません。

于 2013-11-12T00:53:46.833 に答える