我们在SQL Server 2008 R2数据库中声明了一个表类型。
CREATE TYPE dbo.PaymentResult AS TABLE
(
ID INT NULL,
PlacementPaymentID INT NOT NULL,
PaymentAllocationID INT NULL,
PaymentTypeID INT NOT NULL,
CostCentreID INT NOT NULL,
CostCentreTeamID INT NOT NULL,
TeamID INT NOT NULL,
PaymentValue DECIMAL(20,10) NOT NULL,
DateAllocated DATE NOT NULL,
AffectedDate DATE NOT NULL,
DailyAllocationTypeID INT NOT NULL,
PlacementID INT NULL
)
GO
然后我们有一个函数,它将该表类型(在上面创建)作为参数,并返回一个结果集:
CREATE FUNCTION [dbo].[udf_PayCarerOnceValidation] (
@PaymentResultsParam dbo.PaymentResult READONLY
)
RETURNS @Results TABLE (
ID INT NOT NULL
, PlacementID INT NOT NULL
, Date DATE NOT NULL
, Amount DECIMAL(18,10)
, CanBePaid BIT NOT NULL
-- REMOVE Placement ID, Date, CanBePaid
)
AS
BEGIN
在函数中,我们声明一个NEW表变量,并从我们的传入参数(表类型)中选择数据到新表变量中,因为我们需要更新其中的值:
因此,首先我们根据表类型声明新的表变量:
DECLARE @PaymentResults as dbo.PaymentResult
然后从函数参数插入表变量:
INSERT INTO @PaymentResults (ID,PlacementPaymentID,PaymentAllocationID,PaymentTypeID,CostCentreID,CostCentreTeamID,TeamID, PaymentValue,DateAllocated,AffectedDate,DailyAllocationTypeID,PlacementID)
SELECT
ID
, PlacementPaymentID
, PaymentAllocationID
, PaymentTypeID
, CostCentreID
, CostCentreTeamID
, TeamID
, PaymentValue
, DateAllocated
, AffectedDate
, DailyAllocationTypeID
, PlacementID
FROM @PaymentResultsParam
当我们运行执行所有这些操作的过程时,我们似乎崩溃了SQL Server!
消息0,级别11,状态0,行0发生严重错误 当前命令。结果(如果有的话)应该被丢弃。消息0, 20级,状态0,0行电流发生严重错误 命令。结果(如果有的话)应该被丢弃。
任何人都可以看到我们做错了什么,为什么我们要杀死服务器实例?如果我们删除最后一段代码(插入表变量),则不会发生崩溃。
请注意。第一次执行时我没有收到错误。它只在第二次运行时失败。到那时,随着服务器重新启动它自己,下一次,它的工作原理。然后我们又崩溃了。
附加信息:我们将函数更改为存储过程 - 它按预期工作!只有当它是一个功能时,它才会失败。它在第一次调用函数时工作 - 但下次失败(相同数据)。好像表变量是'锁定'?
此外,我们在两个独立的服务器实例,不同的数据集上尝试了这一点,并且在两者上都以相同的方式失败。