2015-11-02 43 views
0

不要问我为什么,但我想有一个列,其中标识存储为varchar。是否可以在创建过程中分配这个值,还是需要范围标识和更新?用当前标识插入新行作为值

编辑:澄清这是一个现有的表,我不能以任何方式修改。我只想插入新的行。

通常我会做到这一点:

INSERT INTO [User] 
(
    -- id -- this column value is auto-generated, 
    useridcr, 
    dtcr, 
    varcharid 
) 
VALUES 
(
    25, 
    '2015-01-30 00:00:00.000' 
    '' 
) 

SET @id = SCOPE_IDENTITY() 

UPDATE [User] 
SET 
    varcharid = @id 
WHERE id = @id 

但有可能知道新标识的该值的创建之前呢?所以我可以使用insert语句中的值。就像这样:

INSERT INTO [User] 
(
    -- id -- this column value is auto-generated, 
    useridcr, 
    dtcr, 
    varcharid 
) 
VALUES 
(
    25, 
    '2015-01-30 00:00:00.000' 
    [generatedID] 
) 

谢谢

+0

你可以在表格中添加一个**触发器**吗?这可能会将您的'varchar'列设置为新插入的身份值的值 –

回答

2

使用computed column

CREATE TABLE [User] 
(
    id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, 
    useridcr INT, 
    dtcr INT , 
    varcharid AS CAST(id AS VARCHAR(10)) 
); 

LiveDemo

那么你并不需要赶上最后产生的价值和更新数据。

或者您可以使用VIEW

CREATE VIEW vw_user 
AS 
SELECT *, 
    [varcharid] = CAST(id AS VARCHAR(10)) 
FROM [User] 

编辑:

您可以使用触发器为:

CREATE TRIGGER trg_User 
ON [User] 
AFTER UPDATE, INSERT 
AS 
BEGIN 
    UPDATE u 
    SET varcharid = CAST(i.id AS VARCHAR(100)) 
    FROM [User] u 
    JOIN inserted i 
    ON u.id = i.id; 
END 
GO 

SqlFiddleDemo

+1

嗨,对不起,我编辑了我原来的帖子。该表已经存在,我不能修改它。 – Zikato

+0

@Zikato你可以在VIEW中使用第二种解决方案吗? – lad2025

+0

我承认我是VIEW的新手,但我怎么能适应插入语句? – Zikato