我实际上想出了一个解决方法。
首先,我将我的用户名和 changesetID 作为参数从 C# 传递到 SQL 存储过程。在我的存储过程中,我将 CONTEXT_INFO 设置为 userName 和 changeSetID 的组合
Declare @userAndSetID VARBINARY(128)
SET @UserName = @UserName + ',' + @ChangeSetID + ','
SET @userAndSetID = CAST(CAST(@UserName AS NVARCHAR(MAX)) AS VARBINARY(128));
SET CONTEXT_INFO @userAndSetID
在我的触发器中,我使用拆分字符串函数从 CONTEXT_INFO() 中检索我的两个变量:
select @ChangedBy = value from dbo.fn_Split((CAST (CONTEXT_INFO() AS NVARCHAR(MAX))),',') where position = 1;
select @changesetID = value from dbo.fn_Split((CAST (CONTEXT_INFO() AS NVARCHAR(MAX))),',') where position = 2;
这里是分割字符串函数,它得到一个用任何符号分隔的字符串,并将它们逐行放入表变量中:
CREATE FUNCTION [dbo].[fn_Split](@text nvarchar(MAX), @delimiter nvarchar(20) = ' ')
RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value nvarchar(1500)
)
AS
BEGIN
DECLARE @index int
SET @index = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @index = CHARINDEX(@delimiter , @text)
IF (@index = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @index - 1))
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @index))
END
RETURN
END
这只是一种解决方法,正如@Tab Alleman 建议的那样,解决此问题的最佳方法是将变量保存在数据库中的某个位置,但由于我目前不想修改数据库,因此此解决方案可以诀窍。