TSQL函数在存储过程强制列中用于只读

Bea*_*Hat 5 c# t-sql sql-server-2008

设置:将DataReader加载到DataTable中.加载后尝试更改DataTable中的列.

问题:尝试更改列时触发了ReadOnlyException.

条件:

  • 当函数(udf或system)应用于存储过程中的别名列时,该列将变为ReadOnly.
  • 如果列简单别名而未应用任何函数,则不会触发错误.
  • 如果将select移动到table-function,则不会触发错误,然后proc从该函数中选择.
  • 在C#中将列属性设置为ReadOnly时,不会发生错误(显然).

问题:是否有任何方法可以更改过程,以便应用了函数的别名列不是ReadOnly?我正在寻找一个替代方案来更改C#或创建一个函数来执行proc已经执行的操作.

C#:

var dt = new DataTable();
using( var sqlDR = objDocsFBO.GetActiveDocsMerged(KeyID) )
{
    dt.Load(sqlDR);
}
foreach( DataRow dr in dt.Rows )
{
    //Testing Alias Alone - Pass
    dr["DocumentPathAlias"] = "file:///" + Server.UrlEncode(dr["DocumentPathAlias"].ToString()).Replace("+", "%20");
    //Testing Function Applied - Fail
    //dr["DocumentPath"] = "file:///" + Server.UrlEncode(dr["DocumentPath"].ToString()).Replace("+", "%20");
}
Run Code Online (Sandbox Code Playgroud)

SQL:

GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_ActiveDocs_RetrieveMerged]
@KeyID INT
AS 
BEGIN
--Testing Select From Function
--SELECT * FROM dbo.ufn_ActiveDocs_RetrieveMerged(@KeyID) --Pass
SELECT AD.ADMergeLogID
, AD.TemplateName
, CONVERT(NVARCHAR(10), AD.InitiatedOn, 101) [CreatedOn]
, (SELECT fn.UserName FROM dbo.ufn_User_GetFullName(AD.InitiatedBy) fn) [CreatedBy]
, AD.DocumentName
, AD.DocumentPath [DocumentPathAlias] --Pass
--, REPLACE(AD.DocumentPath, '\\', '\') [DocumentPath] --Fail
--, dbo.udf_VerifyPath(AD.DocumentPath) [DocumentPath] --Fail
FROM dbo.ActiveDocsMergeLog AD
WHERE AD.DocumentPath != 'DocumentPath not found.'
AND AD.KeyID = @KeyID
END
Run Code Online (Sandbox Code Playgroud)

小智 1

如果将查询放入临时表中,它将覆盖任何表架构属性 SQL 集。