SQL Server 我需要一个T-SQL脚本来只更新整个表的一行中的标题

vktxenjb  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(112)

我需要编写一个T-SQL脚本,它只更新行中的标题。
例如,我需要将Mr Test Test更新为Mr. Test Test,其中Mr通过.更改为Mr.
我需要这样做的几个标题虽然。
我该怎么做呢?

arknldoa

arknldoa1#

@Andres发布的内容应该可以解决这个问题。我喜欢将前缀存储在表中,这样当你想写一个新地址时就不需要更新代码了。借用Andres的代码,我把这个放在一起...
首先是样本数据和样本模式表:

-- Create the test table
DECLARE @Test TABLE 
(
    ID     int           NOT NULL PRIMARY KEY IDENTITY(1,1),
    [Name] nvarchar(100) NOT NULL
);

-- Create the prefix table
DECLARE @prefix TABLE
(
    ID     int           NOT NULL PRIMARY KEY IDENTITY(1,1),
    Prefix nvarchar(100) NOT NULL
);

-- Insert test data
INSERT @Test([Name]) VALUES ( N'Mr Edison' ), ( N'Mrs Rosenbaum' ), ( N'Lt McAllister' ),
                        ( N'Mr. White' ),( N'Smith' ), ( N'John Meyer' ), ( N'Mr Mrson' ),
                        ( N'Dr Jones' ),( N'Dr. Smith' ), ( N'Mrs John Meyer' ),('Ms B');

INSERT @prefix(Prefix) VALUES('Mr'),('Ms'),('Mrs'),('Lt'),('Dr');

接下来是一个显示我们将要执行的操作的查询:

-- Select statement that shows what we are doing
SELECT 
  t.Id,
  OldName   = t.[Name],
  [NewName] =  STUFF(t.[Name], CHARINDEX(p.Prefix+' ',t.[name])+LEN(p.Prefix), 0,'.')
FROM @Test   AS t
JOIN @prefix AS p ON CHARINDEX(p.Prefix+' ',t.[name])>0;
    • 结果:**
Id   OldName         NewName
---- --------------- ---------------
1    Mr Edison       Mr. Edison
7    Mr Mrson        Mr. Mrson
11   Ms B            Ms. B
2    Mrs Rosenbaum   Mrs. Rosenbaum
10   Mrs John Meye   Mrs. John Meyer
3    Lt McAllister   Lt. McAllister
8    Dr Jones        Dr. Jones
    • UPDATE语句:**
UPDATE @Test
SET [Name] = STUFF(t.[Name], CHARINDEX(p.Prefix+' ',t.[name])+LEN(p.Prefix), 0,'.')
FROM @Test   AS t
JOIN @prefix AS p ON CHARINDEX(p.Prefix+' ',t.[name])>0;
    • 结果:**
ID    Name
----- --------------------
1     Mr. Edison
2     Mrs. Rosenbaum
3     Lt. McAllister
4     Mr. White
5     Smith
6     John Meyer
7     Mr. Mrson
8     Dr. Jones
9     Dr. Smith
10    Mrs. John Meyer
11    Ms. B

请注意,我搜索的前缀后跟一个空格,以避免将"Mr. Wes Simson"更改为"Mr. Wes Sims.son"

mqkwyuun

mqkwyuun2#

我假设标题只在字符串的开头,它们总是被空格分隔开。

创建测试环境

USE tempdb;

-- Create the test table
CREATE TABLE dbo.Test
(
    ID     int           NOT NULL PRIMARY KEY IDENTITY(1,1),
    [Name] nvarchar(100) NOT NULL
);

-- Insert test data
INSERT INTO dbo.Test ( [Name] )
VALUES
( N'Mr Edison' ), 
( N'Mrs Rosenbaum' ), 
( N'Lt McAllister' ), 
( N'Mr. White' ), 
( N'Smith' ), 
( N'John Meyer' ), 
( N'Mr Mrson' );

更新行

UPDATE dbo.Test 
SET [Name] =
    LEFT([Name], CHARINDEX(N' ', [Name]) - 1) +
    N'. ' +
    SUBSTRING([Name], CHARINDEX(N' ', [Name]) + 1, 99)
WHERE CHARINDEX(N' ', [Name]) > 0
  AND LEFT([Name], CHARINDEX(N' ', [Name]) - 1) IN
  (
    N'Mr',
    N'Mrs',
    N'Lt'
  );

结果行

| 识别号|姓名|
| - ------|- ------|
| 1个|爱迪生先生|
| 第二章|罗森鲍姆夫人|
| 三个|麦卡利斯特中尉|
| 四个|怀特先生|
| 五个|史密斯|
| 六个|约翰·迈耶|
| 七|先生|

清理

DROP TABLE dbo.Test

相关问题