2016-05-23 5 views
1

Я пытаюсь сделать скалярную функцию в SQL Server. Я придумал вверх оператор выбора следующим образом:Выполнение динамического запроса внутри скалярной функции sql server

SET @Statement1 = 'SELECT 1 FROM ' + @p_TableName + 
        ' WHERE RegionTypeID = 1 AND RegionID = ' + 
        CONVERT (nvarchar (50), @p_RegionID) 

Здесь @p_TableName это имя таблицы (NVARCHAR (500)) и @p_RegionID является UniqueIdentifier.

Я теперь выполняет вышеуказанное заявление следующим образом:

EXEC @ReturnValue1 = @Statement1 

ГДЕ @ReturnValue1 является внутр.

Но когда я называю эту функцию из другого я получаю эту ошибку:

The name 'SELECT 1 FROM [PS].[Availability] WHERE RegionTypeID = 1 AND RegionID = AF4C182C-F751-41AD-AA6A-20A50A7A38C8' is not a valid identifier.

Мне нужно знать, как я могу назвать динамический SQL SELECT заявления внутри скалярной функции.

+1

Dynamic SQL не допускается в UDFs. Проверьте [здесь] (http://www.sommarskog.se/dynamic_sql.html#UDF) для хорошей справки по этой теме. –

+0

Спасибо ... Можете ли вы предложить обходной путь для моей проблемы? Есть ли другой способ, с помощью которого я могу написать оператор select, указанный выше? Все, что мне нужно, это знать, имеются ли RegionTypeID и RegionID? –

+1

@SarinGopalan вы можете использовать хранимую процедуру (SP) вместо функции. Результаты SP могут быть записаны в таблицу, если вам это нужно. – gofr1

ответ

0

Вы можете создать СП, как показано ниже с выходным параметром:

CREATE PROCEDURE ProcNameGoesHere 
    @p_TableName nvarchar(500), 
    @p_RegionID uniqueidentifier, 
    @output int OUTPUT 
AS 
BEGIN 
    DECLARE @Statement1 nvarchar(max), 
      @ParmDefinition nvarchar(500) 

    SET @Statement1 = N'SELECT @someValue = 1 FROM ' + @p_TableName + 
         ' WHERE RegionTypeID = 1 AND RegionID = ' + 
         CONVERT (nvarchar (50), @p_RegionID) 
    SET @ParmDefinition = N'@someValue int OUTPUT' 

    EXEC sp_executesql @Statement1, @ParmDefinition, @[email protected] OUTPUT 

    RETURN; 

END 

Тогда вы можете назвать это так:

DECLARE @output int 

EXEC ProcNameGoesHere '[PS].[Availability]','AF4C182C-F751-41AD-AA6A-20A50A7A38C8', @output OUTPUT 

SELECT @output 

Или:

IF ISNULL(@output,0) = 1 
BEGIN 
    --Do something here 
END 
+0

Отлично! Спасибо всем ..... –

+0

Мое удовольствие! Если ответ полезен, не стесняйтесь повышать/принимать его, это отличный способ сказать спасибо! :) – gofr1

Смежные вопросы