пятница, 8 января 2010 г.

MS Sql Server error with computed column

Здравствуйте, меня зовут Почепцов Вячеслав и сегодня я начну серию технических постов, связанных с различными аспектами разработки и способных помочь людям, которые столкнуться с подобными проблемами или размышлениями.
Сейчас я занимаюсь разработкой высоконагруженного сайта LiquidGeneration, написанного моей командой на ASP.NET MVC 1.0, IIS 7.0, Windows 2008, MS Sql Server 2005.
Сегодня рассмотрим простую ситуацию в MS Sql Server 2005, которая вызывает ошибку
Internal Query Processor Error: The query processor could not produce a query plan. For more information, contact Customer Support Services.
USE [master]
GO

-- SET ANSI_PADDING that preferred on Sql Server 2005+
SET ANSI_PADDING ON
GO

-- drop databse if it already exists
IF  EXISTS (SELECT name FROM sys.databases WHERE name = N'test')
DROP DATABASE [test]
GO

CREATE DATABASE [test];
GO

USE [test]
GO


CREATE TABLE [dbo].[CHILD](
[ID] [int] NOT NULL,
[SOME_FIELD] [nvarchar](40) NOT NULL
) ON [PRIMARY]
GO

-- create table with computed field. it's important!
CREATE TABLE [dbo].[PARENT](
[ID] [int] NOT NULL,
[NAME] [nvarchar](40) NOT NULL,
[COMPUTED_FIELD]  AS (replace([NAME],' ','_')) PERSISTED,
CONSTRAINT [PK_PARENT] PRIMARY KEY CLUSTERED ([ID] ASC))

--create foreign key constraint
ALTER TABLE [dbo].[CHILD]  ADD  CONSTRAINT [FK_PARENT_CHILD] FOREIGN KEY([ID])
REFERENCES [dbo].[PARENT] ([ID])
GO

-- insert some data into tables
-- to verify that insert operation works well
INSERT PARENT
SELECT 1, 'bill'
UNION ALL
SELECT 2, 'john'
UNION ALL
SELECT 3, 'jett'

INSERT CHILD
SELECT 1, 'test1'
UNION ALL
SELECT 2, 'test2'
UNION ALL
SELECT 3, 'test3'
GO

-- create stored procedure that perform the same insert that previous sql command
-- it use child table that has foreign key to parent table with computed field
CREATE PROCEDURE [dbo].[sp_InsertIntoChild]
AS
BEGIN
INSERT CHILD
SELECT 3, 'test4'
END
GO

-- set padding off - it's default settings for connections from DB-Library applications
SET ANSI_PADDING OFF
GO

-- run stored procedure
EXEC    [dbo].[sp_InsertIntoChild]

SELECT * FROM [CHILD]

Исправить проблему можно достаточно просто установив SET ANSI_PADDING ON, но при вызове из приложения при создании соединения установить это невозможно.

Ошибка обрабатывается специалистами Microsoft, обещали исправить.

Sql cкипрт

0 коммент.:

Отправить комментарий