Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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
C# 表类型的游标不工作_C#_Sql Server - Fatal编程技术网

C# 表类型的游标不工作

C# 表类型的游标不工作,c#,sql-server,C#,Sql Server,这是我的光标 将表类型传递给游标以更新表列 DECLARE cur CURSOR FOR SELECT * FROM @AutoDataType OPEN cur FETCH NEXT FROM cur INTO @Customer_Id,@First_Name WHILE @@FETCH_STATUS = 0 BEGIN UPDATE [dbo].[ABC] SET [Customer_Id] =@Customer_Id WHE

这是我的光标

将表类型传递给游标以更新表列

DECLARE cur CURSOR FOR SELECT * FROM @AutoDataType 
OPEN cur    
FETCH NEXT FROM cur INTO @Customer_Id,@First_Name
WHILE @@FETCH_STATUS = 0 
BEGIN           
  UPDATE [dbo].[ABC] SET [Customer_Id] =@Customer_Id            
  WHERE LOWER([PH_FirstName])=LOWER(@First_Name)                    
  FETCH NEXT FROM cur INTO @Customer_Id,@First_Name
END
CLOSE cur    
DEALLOCATE cur
当我试图从下面的查询窗口执行这个游标时,它工作得很好

Declare @AutoDataType As [dbo].[Auto_DataType]
Insert Into @AutoDataType(Customer_Id,First_Name) Values('11111','JOHN');
Exec sp_TEST @AutoDataType
但是通过C#代码它不工作,也没有错误

我做错了什么

这是我的桌子类型:

CREATE TYPE [dbo].[Auto_DataType] AS TABLE([Customer_Id] [varchar](50) NULL,
                                           [First_Name] [varchar](50) NULL)
以下是我的存储过程:

CREATE PROCEDURE [dbo].[sp_TEST](@AutoDataType As [dbo].[Auto_DataType] Readonly)
AS
Begin
DECLARE @Row_Id Int;
DECLARE @Customer_Id Varchar(50);
DECLARE @First_Name Varchar(50);
DECLARE @Last_Name Varchar(50);
DECLARE @DOB Varchar(50);
DECLARE @License_Number Varchar(50);
DECLARE @TransId VARCHAR(50);   
DECLARE @TimeStamp DATETIME;    
DECLARE cur CURSOR FOR SELECT * FROM @AutoDataType 
OPEN cur    
FETCH NEXT FROM cur INTO @Customer_Id,@First_Name
WHILE @@FETCH_STATUS = 0 
    BEGIN           
        UPDATE [dbo].[ABC] SET [Customer_Id]  =@Customer_Id            
        WHERE LOWER([PH_FirstName])=LOWER(@First_Name)   
        FETCH NEXT FROM cur INTO @Customer_Id,@First_Name
    END
CLOSE cur    
DEALLOCATE cur  
End

这里根本不需要光标。这应该是一个update语句

UPDATE a SET [Customer_Id] = adt.Customer_Id            
FROM @AutoDataType adt
JOIN [dbo].[ABC] a on a.PH_FirstName = adt.First_Name
WHERE LOWER(a.[PH_FirstName]) = LOWER(adt.First_Name)   

请注意,除非您有区分大小写的排序规则,否则此处的where谓词毫无意义。就像在代码中一样,它将更新行,即使它们不是相同的情况。我建议删除where子句。

请在问题中添加所有元素。我假设光标是存储过程的一部分,因为您使用
Exec sp_TEST@AutoDataType
调用它;存储过程中有什么?自定义数据类型的定义是什么?这看起来像sql server,而不是MySQL。请建议我如何循环表类型并更新表