.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