使用 select query/subquery in SQL 中的值更新字段
Update field with values from a select query/subquery in SQL
您好,我需要 select 一个特定的字符串形成一个字段 table,然后填充同一个 SQL 数据库中不同 table 中的另一个字段。我正在从字段中提取日期。字符位于两个下划线之间。我能够使用 Stack 中先前 post 的指导正确创建 Select 语句,但是当我尝试将其与更新语句融合时,会抛出错误。我检查了两个字段,它们的类型相同 NVARCHAR。
提前致谢。
抛出的错误= 当子查询没有用EXISTS引入时select列表中只能指定一个表达式
UPDATE [DMSEngine_HR].[dbo].[IndexForm_Legiant]
SET [DMSEngine_HR].[dbo].[IndexForm_Legiant].Date_Field=
(SELECT [DisplayName],
CASE
WHEN CHARINDEX('_',(SUBSTRING([DisplayName],CHARINDEX('_',[DisplayName],1)+1,99))) = 0
THEN LTRIM(RTRIM(SUBSTRING([DisplayName],CHARINDEX('_',[DisplayName],1)+1,99)))
ELSE LTRIM(RTRIM(SUBSTRING(
/* <text>> */ [DisplayName],
/* <start > */ CHARINDEX('_',[DisplayName],1) + 1,
/* <length> */ CHARINDEX('_', SUBSTRING([DisplayName],
CHARINDEX('_', [DisplayName], 1) + 1, 99)) - 1
) ) )
END AS Result_string
FROM [DMSEngine_HR].[dbo].[Document]
where DocumentPath like'%legiant%')
FROM [DMSEngine_HR].[dbo].[IndexForm_Legiant] INNER JOIN [DMSEngine_HR].[dbo].[Document]
ON [DMSEngine_HR].[dbo].[Document].DocumentID = [DMSEngine_HR].[dbo].[IndexForm_Legiant].DocumentID```
我认为这就是您要查找的内容,您的查询有几个问题,所以我不确定您要更新的是哪些列
UPDATE
l
SET l.Date_Field=
CASE
WHEN CHARINDEX('_',(SUBSTRING([DisplayName],CHARINDEX('_',[DisplayName],1)+1,99))) = 0
THEN LTRIM(RTRIM(SUBSTRING([DisplayName],CHARINDEX('_',[DisplayName],1)+1,99)))
ELSE LTRIM(RTRIM(SUBSTRING(
/* <text>> */ [DisplayName],
/* <start > */ CHARINDEX('_',[DisplayName],1) + 1,
/* <length> */ CHARINDEX('_', SUBSTRING([DisplayName],
CHARINDEX('_', [DisplayName], 1) + 1, 99)) - 1
) ) )
END
FROM
[DMSEngine_HR].[dbo].[IndexForm_Legiant] l
INNER JOIN [DMSEngine_HR].[dbo].[Document] d
ON
d.DocumentID = l.DocumentID
AND DocumentPath like'%legiant%';
您好,我需要 select 一个特定的字符串形成一个字段 table,然后填充同一个 SQL 数据库中不同 table 中的另一个字段。我正在从字段中提取日期。字符位于两个下划线之间。我能够使用 Stack 中先前 post 的指导正确创建 Select 语句,但是当我尝试将其与更新语句融合时,会抛出错误。我检查了两个字段,它们的类型相同 NVARCHAR。
提前致谢。
抛出的错误= 当子查询没有用EXISTS引入时select列表中只能指定一个表达式
UPDATE [DMSEngine_HR].[dbo].[IndexForm_Legiant]
SET [DMSEngine_HR].[dbo].[IndexForm_Legiant].Date_Field=
(SELECT [DisplayName],
CASE
WHEN CHARINDEX('_',(SUBSTRING([DisplayName],CHARINDEX('_',[DisplayName],1)+1,99))) = 0
THEN LTRIM(RTRIM(SUBSTRING([DisplayName],CHARINDEX('_',[DisplayName],1)+1,99)))
ELSE LTRIM(RTRIM(SUBSTRING(
/* <text>> */ [DisplayName],
/* <start > */ CHARINDEX('_',[DisplayName],1) + 1,
/* <length> */ CHARINDEX('_', SUBSTRING([DisplayName],
CHARINDEX('_', [DisplayName], 1) + 1, 99)) - 1
) ) )
END AS Result_string
FROM [DMSEngine_HR].[dbo].[Document]
where DocumentPath like'%legiant%')
FROM [DMSEngine_HR].[dbo].[IndexForm_Legiant] INNER JOIN [DMSEngine_HR].[dbo].[Document]
ON [DMSEngine_HR].[dbo].[Document].DocumentID = [DMSEngine_HR].[dbo].[IndexForm_Legiant].DocumentID```
我认为这就是您要查找的内容,您的查询有几个问题,所以我不确定您要更新的是哪些列
UPDATE
l
SET l.Date_Field=
CASE
WHEN CHARINDEX('_',(SUBSTRING([DisplayName],CHARINDEX('_',[DisplayName],1)+1,99))) = 0
THEN LTRIM(RTRIM(SUBSTRING([DisplayName],CHARINDEX('_',[DisplayName],1)+1,99)))
ELSE LTRIM(RTRIM(SUBSTRING(
/* <text>> */ [DisplayName],
/* <start > */ CHARINDEX('_',[DisplayName],1) + 1,
/* <length> */ CHARINDEX('_', SUBSTRING([DisplayName],
CHARINDEX('_', [DisplayName], 1) + 1, 99)) - 1
) ) )
END
FROM
[DMSEngine_HR].[dbo].[IndexForm_Legiant] l
INNER JOIN [DMSEngine_HR].[dbo].[Document] d
ON
d.DocumentID = l.DocumentID
AND DocumentPath like'%legiant%';