Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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# 存储过程中使用的TSQL函数将列强制为只读_C#_Sql Server 2008_Tsql - Fatal编程技术网

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

C# 存储过程中使用的TSQL函数将列强制为只读,c#,sql-server-2008,tsql,C#,Sql Server 2008,Tsql,设置:将DataReader加载到DataTable中。尝试在加载后更改DataTable中的列 问题:试图更改列时触发ReadOnlyException 条件: 将函数udf或系统应用于中的别名列时 在存储过程中,列变为只读。 如果列只是在没有应用函数的情况下使用别名,则不会触发该错误。 如果将select移动到表函数,然后proc从该函数中选择,则不会触发错误。 在C中将column属性设置为ReadOnly时,显然不会发生此错误。 问题是:有没有办法改变一个过程,使应用了函数的别名列不再是

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

问题:试图更改列时触发ReadOnlyException

条件:

将函数udf或系统应用于中的别名列时 在存储过程中,列变为只读。 如果列只是在没有应用函数的情况下使用别名,则不会触发该错误。 如果将select移动到表函数,然后proc从该函数中选择,则不会触发错误。 在C中将column属性设置为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集。

它将更新什么?由于列只是一个函数的结果,因此代码将写入什么?存储过程只运行SELECT。在哪里需要读/写列?@JoshuaDrake一旦查询结果在DataTable中,列就有了它们的值,而代码不关心这些值来自哪里。但它确实尊重列的任何属性。当设置ReadOnly=false时,问题并不直接与写入的列有关。我猜SQL会对计算列应用默认的ReadOnly,无论该列是在表、视图、过程还是函数中。我希望有一个设置来覆盖它。@AaronBertrand我正在尝试更改C中的列值。我想你已经注意到,当它在表中时,它没有遇到问题,你能进一步解释一下你的说法吗:如果将select移到表函数,则不会触发错误。我昨天无法编辑我的帖子,但这也是我得出的结论。谢谢