c# - 存储过程中使用的 TSQL 函数强制列为只读

标签 c# sql-server-2008 tsql

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

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

条件:

  • 当函数(udf 或 system)应用到别名列时 存储过程,该列变为只读。
  • 如果该列只是别名而没有应用任何功能,则不会触发错误。
  • 如果将选择移动到表函数,则不会触发错误,然后 proc 从该函数中选择。
  • 在 C# 中将列属性设置为 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");
}

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

最佳答案

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

关于c# - 存储过程中使用的 TSQL 函数强制列为只读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10031685/

相关文章:

mysql - 在一个过程中执行插入和更新操作

sql - SQL:如何动态循环并将N个具有NULL值的列添加到临时表中

sql - 移动平均线/滚动平均线

sql - 将每行中带有标识参数的表行 SQL SERVER 2008 转换为单行

c# 替换字符串中字符选择的每个实例

c# - 静态内存管理

c# - 具有 1 个发布者和 4 个并行消费者的 Disruptor 示例

c# - 使用 "Reference3 Interface"向项目添加所需的引用

sql-server - Microsoft SQL Server - 事务日志已满是什么意思?

sql - 索引只有一列的表有意义吗?