我在 SQL Server 2008 中创建了一个表,如下所示:
编辑:我一直在做一些设置 ANSI_NULLS OFF 和 ON 的测试,我错误地粘贴了 ANSI_NULLS OFF 的 create table 语句,我已经尝试了两种方法,但我仍然得到错误但想解决这个问题。希望没有其他粘贴错误。
编辑 2:我忘了指出,如果我查询原始表 (TblValues) 一切正常,则有关 ANSI_NULLS 选项的错误仅在使用 db 视图 (TblValuesView) 时发生。
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
CREATE TABLE TblValues
(
Context nvarchar(8) NOT NULL,
ParentID uniqueidentifier NOT NULL,
RowSeq int NOT NULL,
FieldValues xml NOT NULL,
FieldProperties xml NOT NULL,
) ON [PRIMARY]
TEXTIMAGE_ON [PRIMARY]
然后我将此表加载到我的数据模型中,并能够使用 LINQ to EF 对其进行查询。FieldValues 列中的 XML 内容旨在如下所示:
<FieldValues>
<FieldValue fieldName="txtName">
<DataType>String</DataType>
<FldValue>field value</FldValue>
</FieldValue>
...
</FieldValues>
由于我需要以更容易阅读的方式提供 xml 列中的值,因此我为此表创建了一个视图,如下所示:
SET NUMERIC_ROUNDABORT OFF;
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT,
QUOTED_IDENTIFIER, ANSI_NULLS ON;
GO
CREATE VIEW TblValuesView
WITH SCHEMABINDING
AS
SELECT TblValuesView.Context,
TblValuesView.ParentID,
TblValuesView.RowSeq,
FldValue.value('(@fieldName)[1]', 'nvarchar(30)') AS FieldName,
FldValue.value('(DataType)[1]', 'nvarchar(13)') AS DataType,
FldValue.value('(FldValue)[1]', 'nvarchar(max)') AS FldValue,
FROM TblValues CROSS APPLY FieldValues.nodes('/FieldValues/FieldValue') AS FldValues(FldValue)
GO
然后我也将此视图添加到数据模型中。现在,如果我从 SQL Server Management Studio 查询此视图,我会得到正确的值:
Context | ParentID | RowSeq | FieldName | DataType | FldValue
----------------------------------------------------------------
Ctx <id> 1 txtName String Field Value
但如果执行以下 LINQ 查询:
var FldValueViewQuery = (from row in CTX.TblValuesView select row);
foreach(TblValuesView tblValue in FldValueViewQuery)
System.Diagnostics.Trace.WriteLine(tblValue.FieldName);
然后我得到以下异常:
System.Data.EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.
System.Data.SqlClient.SqlException: SELECT failed because the following SET options have incorrect settings: 'ANSI_NULLS'.
Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.
如果我这样做,我只能从 SQL Server Mgmt studio 得到这个错误:
SET ANSI_NULLS OFF
select * from TblValuesView
我已经搜索过 EF 是否在运行时更改了此选项,并且我已经检查了我的数据库是否启用了 ANSI_NULLS 并默认为 true。我还能检查什么?处理这种情况的资源并不多。
提前致谢!