Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.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
.net 内联函数的sys.columns中的_标识错误_.net_Sql Server_Sql Server 2012 - Fatal编程技术网

.net 内联函数的sys.columns中的_标识错误

.net 内联函数的sys.columns中的_标识错误,.net,sql-server,sql-server-2012,.net,Sql Server,Sql Server 2012,内联函数的sys.columns有问题。 可能是SQL Server出错,或者我遗漏了什么 让我们从头开始,我有一个简单的表和一个简单的函数,如下所示: DROP TABLE [dbo].[SimpleTable] GO CREATE TABLE [dbo].[SimpleTable]( [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, [descr] [varchar](50) NULL ) GO DR

内联函数的
sys.columns
有问题。
可能是SQL Server出错,或者我遗漏了什么

让我们从头开始,我有一个简单的表和一个简单的函数,如下所示:

DROP TABLE [dbo].[SimpleTable]
GO

CREATE TABLE [dbo].[SimpleTable](
    [id] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
    [descr] [varchar](50) NULL
    )
GO

DROP VIEW SimpleView
GO

CREATE VIEW SimpleView
AS
SELECT * FROM SimpleTable
GO

DROP FUNCTION SimpleFunction
GO

CREATE FUNCTION SimpleFunction(
    @dummy INT = NULL
)
RETURNS TABLE
RETURN
SELECT * FROM SimpleTable
GO
我可以使用直接“表插入”或间接“函数插入”将行插入SimpleTable,如下所示:

INSERT INTO SimpleTable (descr) VALUES ('DIRECT TABLE INSERT');
INSERT INTO SimpleView (descr) VALUES ('VIEW INSERT');
INSERT INTO SimpleFunction(DEFAULT) (descr) VALUES ('INLINE FUNCTION INSERT');

SELECT * FROM SimpleTable;
是的,它起作用了

id  descr
1   DIRECT TABLE INSERT
2   VIEW INSERT
3   INLINE FUNCTION INSERT
当我尝试在列
id
中插入带有显式null或显式值的行时,SimpleTable和SimpleFunction insert的行为相同:

INSERT INTO SimpleTable (id, descr) VALUES (3, 'DIRECT TABLE INSERT')
INSERT INTO SimpleView (id, descr) VALUES (5, 'VIEW INSERT')
INSERT INTO SimpleFunction(DEFAULT) (id, descr) VALUES (4, 'INLINE FUNCTION INSERT')

Server: Msg 544, Level 16, State 1, Line 1
Cannot insert explicit value for identity column in table 'SimpleTable' when IDENTITY_INSERT is set to OFF.
Server: Msg 544, Level 16, State 1, Line 2
Cannot insert explicit value for identity column in table 'SimpleTable' when IDENTITY_INSERT is set to OFF.
Server: Msg 544, Level 16, State 1, Line 3
Cannot insert explicit value for identity column in table 'SimpleTable' when IDENTITY_INSERT is set to OFF.

因此没有区别,列id在两种方式中都被识别并视为标识

但是现在让我们看一下<代码> sys >列< /> >:

SELECT o.name o_name, o.type, o.type_desc, c.name c_name, c.is_identity
FROM sys.objects o
JOIN sys.columns c on o.object_id = c.object_id
where o.name in ( 'SimpleTable', 'SimpleFunction')
and c.name = 'id' 

o_name          type    type_desc                           c_name  is_identity
SimpleTable     U       USER_TABLE                          id      1
SimpleView      V       VIEW                                id      1
SimpleFunction  IF      SQL_INLINE_TABLE_VALUED_FUNCTION    id      0
还有
sys.dm\u exec\u description\u first\u result\u set
(感谢@Jeroen Mostert):

如您所见,SimpleTable的identity列在函数结构中没有标记为identity。

我的问题是为什么

我在.NET中使用了
DbCommandBuilder
,因此它产生了错误的查询


我曾尝试手动更改它,但自SQL server 2008以来就不可能了。

完全没有用于表值函数的文档,只用于表、表变量、视图和
OPENQUERY
。在某种程度上,祝贺你发现了这项工作。考虑到它的存在,行为应该与视图(传播信息的视图)一致,但事实并非如此,甚至与SCHEMABINDING不一致。如果这是预期的行为或需要修复的东西,我建议打开Microsoft Connect上的错误报告(但老实说,我并不期望他们修复它)。@Jeroenmoster非常感谢您的宝贵帮助。我也用视图进行了测试,效果很好(见更新的答案)。我为这种奇怪的行为开了罚单
SELECT o.name o_name, o.type, o.type_desc, c.name c_name, c.is_identity
FROM sys.objects o
JOIN sys.columns c on o.object_id = c.object_id
where o.name in ( 'SimpleTable', 'SimpleFunction')
and c.name = 'id' 

o_name          type    type_desc                           c_name  is_identity
SimpleTable     U       USER_TABLE                          id      1
SimpleView      V       VIEW                                id      1
SimpleFunction  IF      SQL_INLINE_TABLE_VALUED_FUNCTION    id      0
Type    name    source_table    source_column   is_identity_column  is_updateable   is_nullable is_part_of_unique_key
U       id      SimpleTable     id              1                   0               0           1
V       id      SimpleTable     id              1                   0               0           1
IF      id      SimpleTable     id              0                   1               0           1