Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 理解游标的工作原理_Sql Server_Tsql - Fatal编程技术网

Sql server 理解游标的工作原理

Sql server 理解游标的工作原理,sql-server,tsql,Sql Server,Tsql,尝试更改某些存储过程和查询以获得更好的性能。在某种程度上,它是在重写游标语法。要做到这一点,我必须充分了解它们是如何工作的。我尝试了这个简单的ETL示例,但它没有给出预期的结果。基本上,在这里用光标向上插入 示例代码: CREATE TABLE #Destination (PersonID INT, FirstName VARCHAR(10), LastName VARCHAR (10)) INSERT INTO #Destination VALUES (101, 'M', 'Donalds

尝试更改某些存储过程和查询以获得更好的性能。在某种程度上,它是在重写游标语法。要做到这一点,我必须充分了解它们是如何工作的。我尝试了这个简单的ETL示例,但它没有给出预期的结果。基本上,在这里用光标向上插入

示例代码:

CREATE TABLE #Destination 
(PersonID INT, FirstName VARCHAR(10), LastName VARCHAR (10))
 INSERT INTO #Destination VALUES (101, 'M', 'Donalds')
 INSERT INTO #Destination VALUES (102, NULL, 'Richards')
 INSERT INTO #Destination VALUES (103, 'Rianna', 'Lock')
 INSERT INTO #Destination VALUES (104, 'Leo', 'Svensson')

 CREATE TABLE #SourceTable 
 (PersonID INT, FirstName VARCHAR(10), LastName VARCHAR (10))
 INSERT INTO #Destination VALUES (102, 'Diana', 'Richards')
 INSERT INTO #SourceTable VALUES (103, 'Rianna', 'Locks')
 INSERT INTO #SourceTable VALUES (106, 'Cleo', 'Davung')

  DECLARE @PersonID INT
  DECLARE @Firstname VARCHAR (10)
  DECLARE @Lastname VARCHAR (10)

  DECLARE SimpleCursor CURSOR FOR 
  SELECT PersonID, FirstName, LastName 
  FROM #SourceTable

  Open SimpleCursor
  FETCH NEXT FROM SimpleCursor INTO @PersonID, @Firstname, @Lastname
  WHILE @@FETCH_STATUS = 0 
  BEGIN
  IF EXISTS ( SELECT PersonID FROM #Destination
              WHERE PersonID = @PersonID )
    UPDATE #Destination  
    SET #Destination.FirstName = #SourceTable.FirstName,
        #Destination.LastName = #SourceTable.LastName
    FROM #SourceTable
    WHERE #Destination.PersonID = #SourceTable.PersonID
  ELSE
    INSERT INTO #Destination
    SELECT PersonID, Firstname, Lastname FROM #SourceTable

  FETCH NEXT FROM SimpleCursor INTO @PersonID, @Firstname, @Lastname
  END

  CLOSE SimpleCursor
  DEALLOCATE SimpleCursor

SELECT * FROM #Destination
我错过了什么?我没有更新任何东西,而PersonID 102和103确实存在


非常感谢。

您没有使用在
UPDATE
INSERT
语句中获取值的变量。尝试:

...
IF EXISTS (SELECT *
                  FROM #Destination
                  WHERE PersonID = @PersonID)
BEGIN
  UPDATE #Destination
         SET FirstName = @FirstName,
             LastName = @LastName
         WHERE PersonID = @PersonID;
END
ELSE
BEGIN
  INSERT INTO #Destination
              (PersonID,
               FirstName,
               LastName)
              VALUES (@PersonID,
                      @FirstName,
                      @LastName);
END;
...

CREATE TABLE#SourceTable
之后的第一个
INSERT
#Destination
作为目标。这是内涵吗?这里有一些语法缺陷,这将使这项工作。。。奇怪地如上所述,每次找到匹配项时,光标都会更新匹配的所有行,这很奇怪,而且工作量太大。它应该从获取的变量
@PersonID
@FirstName
@LastName
进行更新。表创建脚本中还有一个语法错误,插入的目标是错误的表;SQL Server的forté不是迭代任务。如果您真的想提高性能,您应该考虑使用数据集方法来解决类似的问题。您是否考虑过使用
MERGE
?@Larnu这篇文章最初是基于2008年编写的,然后在2012年进行了更新(它注意到了您将看到的一些修复)。