2017-07-25 57 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是运行和被修改到确切的要求看到更新在post –

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