2

我已经尝试了很多代码,但它一直没用。

所以,我需要为一个只有完整名称的表设置一个游标:

create database DB01

use DB01

create table Clients
(
     complete_name varchar(50)
)

insert into Clients 
values ('Ralph Van Beethoven')

没问题。

现在,我有另一个数据库,我必须在其中将我的名字分成 Name、First Last Name 和 Second Last Name,所以它必须是这样的:

  • 姓名:拉尔夫
  • 名:范
  • 第二姓:贝多芬

代码:

create database DB02

use DB02

create table Clients_Details
(
     Name varchar(50),
     First_Last_Name varchar(50),
     Second_Last_Name varchar(50)
)

真正的东西来了。我需要一个游标来从 DB01 中拆分完整名称并将其插入 DB02,我有以下代码:

Declare @name as varchar(50)
Declare cClients cursor for Select complete_name from Clients

Declare @temporal table 
(
    tName varchar(50),
    tFLName varchar(50),
    tSLName varchar(50)
)

Open cClients

Fetch cClients into @name

While (@@fetch_status = 0 )
Begin
    Insert into @temporal
        Select 
            case charindex(' ', @name) 
               when 0 then @name 
               else left(@nname, charindex(' ', @name) - 1) 
            end as tFLName,   
            case charindex(' ', @name) 
               when 0 then null 
               else right(@nname, len(@name) - charindex(' ', @nombre)) 
            end as tSLName
        from 
            Clients

        Insert into BD02.dbo.Clients_Details 
            select tName, tFLName, tSLName 
            from @temporal

    Fetch cClientes into @namecursor
End

Close cClients
Deallocate cClients

它抛出一个错误

列名或指定列与定义不匹配

所以我猜我的错误在于charindex因为它只保存了第一个姓氏和第二个姓氏,但我不太确定现在该做什么。

有人可以帮助我吗?

4

2 回答 2

4

首先,您不需要光标来执行此操作

Insert into BD02.dbo.Clients_Details(tName,tFLName,tSLName)
SELECT NAME= Reverse(Parsename(Replace(Reverse(complete_name), ' ', '.'), 1)),
       First_Last_Name= Reverse(Parsename(Replace(Reverse(complete_name), ' ', '.'), 2)),
       Second_Last_Name= Reverse(Parsename(Replace(Reverse(complete_name), ' ', '.'), 3))
FROM   Clients 

结果

╔═══════╦═════════════════╦══════════════════╗
║ NAME  ║ First_Last_Name ║ Second_Last_Name ║
╠═══════╬═════════════════╬══════════════════╣
║ Ralph ║ Van             ║ Beethoven        ║
╚═══════╩═════════════════╩══════════════════╝

给你的教授(不推荐

DECLARE @name AS VARCHAR(50)
DECLARE cClients CURSOR FOR
  SELECT complete_name
  FROM   Clients

OPEN cClients
FETCH cClients INTO @name

WHILE ( @@FETCH_STATUS = 0 )
  BEGIN
      INSERT INTO Clients_Details
      SELECT NAME= Reverse(Parsename(Replace(Reverse(@name), ' ', '.'), 1)),
             First_Last_Name= Reverse(Parsename(Replace(Reverse(@name), ' ', '.'), 2)),
             Second_Last_Name= Reverse(Parsename(Replace(Reverse(@name), ' ', '.'), 3))

      FETCH cClients INTO @name
  END

CLOSE cClients

DEALLOCATE cClients 
于 2016-02-24T17:13:55.677 回答
1

我有一个拆分功能,可以一直追溯到我的 SQL Server 2000 天...

CREATE FUNCTION [dbo].[ufn_Split] 
    (
        @str_in VARCHAR(8000),
        @separator VARCHAR(4)
    )
RETURNS @strtable TABLE (pos int PRIMARY KEY NOT NULL, value varchar(8000))
AS
BEGIN
    DECLARE
    @Occurrences INT,
    @Counter INT,
    @tmpStr VARCHAR(8000)

    SET @Counter = 0
    IF SUBSTRING(@str_in,LEN(@str_in),1) <> @separator 
    SET @str_in = @str_in + @separator
    SET @Occurrences = (DATALENGTH(REPLACE(@str_in,@separator,@separator+'#')) - DATALENGTH(@str_in))/ DATALENGTH(@separator)
    SET @tmpStr = @str_in
    WHILE @Counter <= @Occurrences 
    BEGIN
        SET @Counter = @Counter + 1
        INSERT INTO @strtable
        VALUES  (@Counter, SUBSTRING(@tmpStr, 1, CHARINDEX(@separator,@tmpStr) - 1))
        SET @tmpStr = SUBSTRING(@tmpStr,CHARINDEX(@separator,@tmpStr)+1,8000)
        IF DATALENGTH(@tmpStr) = 0
        BREAK
    END
    RETURN 
END
于 2016-02-24T17:17:01.387 回答