2017-07-25 7 views
0

テーブルの値を 'UNKNOWN' + 0001の形式でユニークな値に更新しようとすると、次の値は 'UNKNOWN' + 0002になります。im runnign intoフィールドを更新しようとするといくつかの問題が発生します。フィールドをvarchar +インクリメントintで更新する方法

DECLARE @idtest VARCHAR(15) 
    SET @idtest = '' 
    UPDATE TABLE1 
    SET @idtest = ID = CONVERT(int,'UNKNOWN'+ CAST(@idtest + 1 AS VARCHAR(15))) 
    where ID is null or LTRIM(RTRIM(ID)) = '' 
    GO 

どのような提案も素晴らしいでしょう。私は、2008 R2までサポートされているSQLのみを使用できます。

UPDATE:

WITH tempUpdateTable AS (
      SELECT t1.*, 
       ROW_NUMBER() over (ORDER BY (SELECT NULL)) AS seqnum 
      FROM table1 t1 
      WHERE ID IS NULL OR LTRIM(RTRIM(ID)) = '' 
     ) 
     UPDATE tempUpdateTable 
     SET ID= 'UNKNOWN' + RIGHT('000' + CAST(seqnum AS VARCHAR(255)), 4); 
+0

あなたはどんなエラーが発生しますか? –

答えて

3

使用row_number()と更新可能なCTE:

with toupdate as (
     select t1.*, 
      row_number() over (order by (select NULL)) as seqnum 
     from table1 
     where ID is null or ltrim(trim(ID)) = '' 
    ) 
update toupdate 
    set id = 'UNKNOWN' + right('00000000', cast(seqnum as varchar(255)), 8); 
+0

病院に戻って明日私はこれを試してみる –

+0

これは、SQLの右側にわずかなエラーがあっただけで2つのパラメータを取る調整されたSQLが実行され、正確な要件に変更されている投稿 –

1

また、これを行うことができます。

DECLARE @idtest INT 
SET @idtest = 0 
UPDATE TABLE1 WITH(TABLOCKX) 
SET @idtest = @idtest + 1, 
    ID = 'UNKNOWN'+ RIGHT('0000' + CAST(@idtest AS VARCHAR(15)) , 4) 
where ID is null or LTRIM(RTRIM(ID)) = '' 
WITH(MAXDOP = 1) 

これはほとんどあなたが持っていたものと同じであり、 SQL Serverは複数の割り当てをサポートしていないという違いがあります。

説明:

  • WITH(TABLOCKX) - 複数の更新
  • を回避するために必要なテーブルの上に排他ロック、
  • WITH(MAXDOP = 1) - 最大並列度は、言い換えれば1に設定され、SQLは、任意のタスクの並列化を行うことができません注文がオフになる可能性があります。

参考文献: SO Quirky UpdateSQLServerCentral Quirky Update

+0

明日明日オフィスに戻ってきます。これを試してみます –

+0

varchar値 'UNKNOWN1'をデータ型intに変換するときに変換に失敗しました。これを実行するとこれが得られます。以前と同じです。 –

+0

@TravisJ - 回答が更新されました – Alex

関連する問題