Sql 使用标识列向计算列添加值
有时我需要将临时值存储到字段中。我有一个存储过程,它使用以下方法添加它:Sql 使用标识列向计算列添加值,sql,tsql,stored-procedures,sql-server-2016,Sql,Tsql,Stored Procedures,Sql Server 2016,有时我需要将临时值存储到字段中。我有一个存储过程,它使用以下方法添加它: Insert new record first then SELECT @Record_Value = SCOPE_IDENTITY(); UPDATE ADMIN_Publication_JSON SET NonPubID = CAST(@Record_Value as nvarchar(20)) + '_tmp' WHERE RecID = @Record_Value 它只需获取标识值并在末尾添加一个“_tmp
Insert new record first then
SELECT @Record_Value = SCOPE_IDENTITY();
UPDATE ADMIN_Publication_JSON
SET NonPubID = CAST(@Record_Value as nvarchar(20)) + '_tmp'
WHERE RecID = @Record_Value
它只需获取标识值并在末尾添加一个“_tmp”。是否有一种方法可以在表中创建一个默认值,如果我没有在该字段中插入值,该默认值将自动创建
NonPubID
列只是一个NVARCHAR(50)
感谢您查看下面的NewKey col:
CREATE TABLE #Table
(
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
IDValue VARCHAR(1) ,
ModifiedDT DATETIME NULL,
NewKey AS ( CONVERT(VARCHAR(100),ID)+'_Tmp' )
)
INSERT #Table( IDValue, ModifiedDT )
SELECT 'A', GETDATE()
UNION ALL
SELECT 'Y', GETDATE() - 1
UNION ALL
SELECT 'N', GETDATE() - 5
SELECT * FROM #Table
查看下面的NewKey col:
CREATE TABLE #Table
(
ID INT NOT NULL IDENTITY(1,1) PRIMARY KEY CLUSTERED,
IDValue VARCHAR(1) ,
ModifiedDT DATETIME NULL,
NewKey AS ( CONVERT(VARCHAR(100),ID)+'_Tmp' )
)
INSERT #Table( IDValue, ModifiedDT )
SELECT 'A', GETDATE()
UNION ALL
SELECT 'Y', GETDATE() - 1
UNION ALL
SELECT 'N', GETDATE() - 5
SELECT * FROM #Table
您可以编写一个触发器,在插入时用该字符串替换
NULL
CREATE TRIGGER admin_publication_json_bi
ON admin_publication_json
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE apj
SET apj.nonpubid = concat(convert(varchar(20), i.id), '_tmp')
FROM admin_publication_json apj
INNER JOIN inserted i
ON i.id = apj.id
WHERE i.nonpubid IS NULL;
END;
缺点:如果需要,您不能为该列显式插入
NULL
s。您可以编写一个触发器,在插入时用该字符串替换NULL
CREATE TRIGGER admin_publication_json_bi
ON admin_publication_json
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE apj
SET apj.nonpubid = concat(convert(varchar(20), i.id), '_tmp')
FROM admin_publication_json apj
INNER JOIN inserted i
ON i.id = apj.id
WHERE i.nonpubid IS NULL;
END;
缺点:如果需要,您不能为该列显式插入NULL
s。对于插入,可以使用DEFAULT
子句。对于更新,可以使用触发器。两者都可以使用序列,而不是标识。我不想将其用作标识,但我想以某种方式使用标识列将默认值添加到NVARCHAR(50)字段中,还是应该将其保留在存储过程中?@user1314159。是否要将NonPubId
设置为任何其他值?对于INSERT,可以使用DEFAULT
子句。对于更新,可以使用触发器。两者都可以使用序列,而不是标识。我不想将其用作标识,但我想以某种方式使用标识列将默认值添加到NVARCHAR(50)字段中,还是应该将其保留在存储过程中?@user1314159。是否要将NonPubId
设置为任何其他值?这意味着NewKey
无法更新。OP没有指定,因此这可能是一个很好的答案,但就我个人而言,我从\u tmp
怀疑OP确实想要更新列。抱歉-我不清楚,但是的,该列通常插入了正确的值。然而;有时正确的值当前不可用,所以我想使用identity columns值加上_tmp,所以我以后要做的就是删除_tmp,我知道哪些记录需要用正确的值更新。好吧,我不明白为什么你会想这样做,即使我提供了上面的答案。RecID列是非null且不可更新的列类型,因为它是标识列。无论您在非ubid列中存储什么,都可以从ID+“\u tmp”建立,所以不需要额外的列。我肯定错过了什么!95%的时间我从政府网站PubMed获得出版物ID。这些是研究人员撰写的文章。这些数字看起来像25465297或26190575。这些数字存储在NVARCHAR(50)字段中,因为如果文章未在PubMed上发布,则必须添加其他值。这些都是即兴创作的,比如一本书、一段视频或一篇博客文章。任何研究人员想要得到赞扬的事情。该表有一列标识它是什么类型的条目。tmp用于所有其他类型的研究,而不是编一个数字或使用guid或其他任何东西,我尝试使用记录id和_tmp。这有帮助吗?这意味着NewKey
无法更新。OP没有指定,因此这可能是一个很好的答案,但就我个人而言,我从\u tmp
怀疑OP确实想要更新列。抱歉-我不清楚,但是的,该列通常插入了正确的值。然而;有时正确的值当前不可用,所以我想使用identity columns值加上_tmp,所以我以后要做的就是删除_tmp,我知道哪些记录需要用正确的值更新。好吧,我不明白为什么你会想这样做,即使我提供了上面的答案。RecID列是非null且不可更新的列类型,因为它是标识列。无论您在非ubid列中存储什么,都可以从ID+“\u tmp”建立,所以不需要额外的列。我肯定错过了什么!95%的时间我从政府网站PubMed获得出版物ID。这些是研究人员撰写的文章。这些数字看起来像25465297或26190575。这些数字存储在NVARCHAR(50)字段中,因为如果文章未在PubMed上发布,则必须添加其他值。这些都是即兴创作的,比如一本书、一段视频或一篇博客文章。任何研究人员想要得到赞扬的事情。该表有一列标识它是什么类型的条目。tmp用于所有其他类型的研究,而不是编一个数字或使用guid或其他任何东西,我尝试使用记录id和_tmp。这有帮助吗?谢谢——我喜欢你的代码,我想我会尝试一下做一些改变——但我仍然喜欢你的代码,我可以尝试一下,但我想我会坚持使用存储过程中的代码,因为我可以更好地控制如何处理来自它的数据。例如,如果它是一本参考书,我可以使用“\u 001”或一篇普通的文章“什么都没有”,或者可能是一篇博客文章“\u blog”。再次感谢Hanks——我喜欢你的代码,我想我会尝试一下做一些改变——但我仍然喜欢你的代码,我可以尝试一下,但我想我会坚持使用存储过程中的代码,因为我可以更好地控制如何处理来自它的数据。例如,如果它是一本参考书,我可以使用“\u 001”或一篇普通的文章“什么都没有”,或者可能是一篇博客文章“\u blog”。再次感谢