Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ловите нумератор  [new]
pifan
Member

Откуда:
Сообщений: 13
Здравствуйте люди.
Давно применяя нумератор для MS SQL, открыл для себя что это, оказывается, является проблемой.
Спешу поделиться. Юзайте.

1. Создать Linked Server на самого себя. Скажем, "LOCAL".

2. Создать таблицу с одним полем, например в БД GenID:

USE [GenID]
GO
CREATE TABLE [dbo].[tbl_Gen](
[GenID] [bigint] IDENTITY(1,1) NOT NULL,
[Stupid] [int] NOT NULL,
CONSTRAINT [PK_tbl_Gen] PRIMARY KEY CLUSTERED
(
[GenID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]


3. Создать процедуру вставки одной записи:

USE [GenID]
GO

/****** Object: StoredProcedure [dbo].[sp_Update] Script Date: 05/22/2012 14:46:22 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE PROC [dbo].[sp_Update]
AS

SET NOCOUNT ON

INSERT tbl_Gen (Stupid) VALUES (0)
SELECT MAX(GenID) FROM tbl_Gen


4. Создать собственно функцию, подключающуюся к этой процедуре через Linked Server на самого себя:



USE [GenID]
GO

/****** Object: UserDefinedFunction [dbo].[f_GenID] Script Date: 05/22/2012 14:50:03 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[f_GenID]
(
)
RETURNS bigint
AS
BEGIN
RETURN (SELECT TOP 1 * FROM OPENQUERY(LOCAL, 'EXEC sp_Update'))
END



5. That's all.
Вызов GenID.dbo.f_GenID() не имеет ограничений, как в версии 2012.
22 май 12, 14:51    [12595026]     Ответить | Цитировать Сообщить модератору
 Re: ловите нумератор  [new]
-=Гость=-
Guest
pifan,

Верх изящества
22 май 12, 14:53    [12595053]     Ответить | Цитировать Сообщить модератору
 Re: ловите нумератор  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
фейспалм.жэпэгэ
22 май 12, 15:43    [12595459]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить