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

Откуда:
Сообщений: 83
Здравствуйте, скажите как можно изменить табличную функцию, чтобы она заработала:

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[GetAllRegisteredObjectsByUserAndLngLat] (@UserID int,
@LatTop float, @LatBottom float, @LngLeft float, @LngRigth float)
RETURNS @nodes TABLE (ObjectID int)
AS
begin
--найдем имена таблиц текущих значений
DECLARE @CURSOR CURSOR
DECLARE @RES int
SET @RES = 0
DECLARE @O_ID int
DECLARE @O_CN varchar(255)

/*Заполняем курсор*/
SET @CURSOR = CURSOR SCROLL FOR
Select [dbo].[Objects].[ObjectID],[dbo].[GetCurrentTableNameFromCode]([dbo].[Devices].[Type]) from [dbo].[Objects]
INNER JOIN DevicesOnObjects ON DevicesOnObjects.ObjectID = Objects.ObjectID
INNER JOIN Devices ON Devices.DeviceID = DevicesOnObjects.DeviceID
where
[dbo].[Objects].[ObjectID] in (Select * from dbo.GetAllRegisteredObjectsByUser(@UserID))
OPEN @CURSOR

/*Выбираем первую строку*/
FETCH NEXT FROM @CURSOR INTO @O_ID,@O_CN
/*Выполняем в цикле перебор строк*/
WHILE @@FETCH_STATUS = 0
BEGIN
--BEGIN
/*exec ('SELECT Longitude, Latitude from ' + @O_CN)
if (Longitude >= @LngLeft AND Longitude <= @LngRigth
AND Latitude >= @LatTop AND Latitude <= @LatBottom)
begin
INSERT INTO @nodes SELECT @O_ID
end*/
--END
FETCH NEXT FROM @CURSOR INTO @O_ID,@O_CN
END
CLOSE @CURSOR
DEALLOCATE @CURSOR
return
end

Спасибо.
3 ноя 12, 11:09    [13417800]     Ответить | Цитировать Сообщить модератору
 Re: Табличная функция  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
http://msdn.microsoft.com/en-us/library/ms186755(v=sql.105).aspx
The following statements are valid in a function:

Assignment statements.

Control-of-Flow statements except TRY...CATCH statements.

DECLARE statements defining local data variables and local cursors.

SELECT statements that contain select lists with expressions that assign values to local variables.

Cursor operations referencing local cursors that are declared, opened, closed, and deallocated in the function. Only FETCH statements that assign values to local variables using the INTO clause are allowed; FETCH statements that return data to the client are not allowed.

INSERT, UPDATE, and DELETE statements modifying local table variables.

EXECUTE statements calling extended stored procedures.
3 ноя 12, 11:33    [13417836]     Ответить | Цитировать Сообщить модератору
 Re: Табличная функция  [new]
Igorgg
Member

Откуда:
Сообщений: 83
Не в CREATE дело, у меня она создана.
Здесь проблема:

/*exec ('SELECT Longitude, Latitude from ' + @O_CN)
if (Longitude >= @LngLeft AND Longitude <= @LngRigth
AND Latitude >= @LatTop AND Latitude <= @LatBottom)
begin
INSERT INTO @nodes SELECT @O_ID
end*/

не могу exec приаттачить.
3 ноя 12, 11:39    [13417840]     Ответить | Цитировать Сообщить модератору
 Re: Табличная функция  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Igorgg
не могу exec приаттачить.
Читать приведенную цитату из документации до просветления.
3 ноя 12, 11:43    [13417844]     Ответить | Цитировать Сообщить модератору
 Re: Табличная функция  [new]
aleks2
Guest
1. Разработчик базы знает толк в извращениях.
2. Вряд ли количество ИМЕН таблиц, возвращаемых [dbo].[GetCurrentTableNameFromCode]([dbo].[Devices].[Type]) много больше сотни.
3. Херачим Partitioning View из всех таблиц и стационарный запрос к оной.
3 ноя 12, 15:13    [13418160]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить