Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Баг или фича  [new]
Vyacheslav 2012
Guest
В SQL Server 2008 R2 такая конструкция не работает
IF OBJECT_ID(N'TableWithPK') IS NULL
CREATE TABLE TableWithPK ([col1] INT PRIMARY KEY)
IF OBJECT_ID(N'TableWithFK') IS NULL
CREATE TABLE TableWithFK ([col1] INT REFERENCES TableWithPK([col1]))

INSERT	TableWithFK([col1])
SELECT	[col1]
FROM	(
		INSERT	TableWithPK([col1])
		OUTPUT	[INSERTED].[col1]
		VALUES(1)
		)insert_out


SELECT * FROM TableWithPK
SELECT * FROM TableWithFK

DROP TABLE TableWithPK
DROP TABLE TableWithFK
GO


но если использовать временные таблицы, то все работает.
CREATE TABLE #TableWithPK ([col1] INT PRIMARY KEY)
CREATE TABLE #TableWithFK ([col1] INT REFERENCES #TableWithPK([col1]))

INSERT	#TableWithFK([col1])
SELECT	[col1]
FROM	(
		INSERT	#TableWithPK([col1])
		OUTPUT	[INSERTED].[col1]
		VALUES(1)
		)insert_out

SELECT * FROM #TableWithPK
SELECT * FROM #TableWithFK

DROP TABLE #TableWithPK
DROP TABLE #TableWithFK
GO

Вопрос - это баг или фича?
10 авг 12, 18:01    [12995711]     Ответить | Цитировать Сообщить модератору
 Re: Баг или фича  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
http://msdn.microsoft.com/en-us/library/ms174979%28SQL.100%29.aspx
When you create local or global temporary tables, the CREATE TABLE syntax supports constraint definitions with the exception of FOREIGN KEY constraints. If a FOREIGN KEY constraint is specified in a temporary table, the statement returns a warning message indicating that the constraint was skipped, and the table is still created without the FOREIGN KEY constraints. Temporary tables cannot be referenced in FOREIGN KEY constraints.
10 авг 12, 18:20    [12995837]     Ответить | Цитировать Сообщить модератору
 Re: Баг или фича  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6727

Кажись меня опять перебросило в параллельную вселенную

Но идиотизм в другом. Хрена что неясно что OUTPUT есть селективный механизм. Мне казалось что это аля Pipe (как в EXEC).
Иначе я никак не могу объяснить другую тупизну - требование с disalow result from trigger.
Ок. Но какого хрена:
USE tempdb
GO
CREATE TABLE dbo.Table1 (ID Int PRIMARY KEY CHECK (ID < 2))
CREATE TABLE dbo.Table2 (ID Int PRIMARY KEY CHECK (ID < 2))
GO
/*
CREATE TRIGGER trTest2 ON dbo.Table2
AFTER Insert AS BEGIN
	SET NOCOUNT ON;
END
GO
*/
INSERT	dbo.Table1 (ID)
OUTPUT	INSERTED.ID + 1
INTO	dbo.Table2 (ID)
VALUES	(-1)
GO
WITH Data AS (SELECT * FROM (VALUES (1))V(ID))
INSERT	dbo.Table2
SELECT	X.ID + 1
FROM	(
/*		INSERT	dbo.Table1 (ID)
		OUTPUT	INSERTED.ID
		VALUES	(1)
*/
		MERGE	dbo.Table1	T
		USING	Data		V ON 1 = 0
		WHEN	NOT MATCHED	THEN INSERT	
		VALUES	(V.ID)
		OUTPUT	INSERTED.ID
	) X
GO
DROP TABLE dbo.Table2
DROP TABLE dbo.Table1
Msg 333, Level 16, State 1, Line 8
Целевая таблица "dbo.Table2" предложения OUTPUT INTO не может иметь какие-либо активные проверочные ограничения или правила. Обнаружено проверочное ограничение или правило "CK__Table2__ID__1C61E2C4".

Msg 547, Level 16, State 0, Line 1
Конфликт инструкции MERGE с ограничением CHECK "CK__Table2__ID__1C61E2C4". Конфликт произошел в базе данных "tempdb", таблица "dbo.Table2", column 'ID'.


Это ихнее INTO нахрен не нужно.
Оно глючное нелогичное, сбивающее с толку. Уродцы. Лучи ненависти.

Интересный баг с текстом во второй ошибке. MERGE как бы проходит, дело то в INSERT.

PS: Спасибо что открыли глаза, стало намного удобнее.
13 авг 12, 12:50    [13003340]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить