2014-10-27 4 views
0

Я пытаюсь использовать функцию openrowset в одной из моих пользовательских функций. он работает правильно, если я передал жесткий кодированный запрос в качестве параметра функции. Но он не работает, если я передал параметр запросу. Ниже приводится моя функция. Пожалуйста, руководство -Вызов Open Rowset в функции

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

CREATE FUNCTION [dbo].[fnGetOutstandingByCurrencyAsString] 
(
    @CustomerID INT 
) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 

    DECLARE @Receipts VARCHAR(8000) 
    SET @Receipts='' 

    DECLARE @Result INT--, @Command VARCHAR(MAX) 

    --SET @Command='Exec spUpdateCustomerBilling 1,1' 

--- Это не работает

SET @Result=(SELECT 1 from OPENROWSET('SQLNCLI11', 'Server=SERVERNAME;UID=username;Pwd=password;','Exec spUpdateCustomerBilling ' + @CustomerID +',1')) 

--- Это работа

SET @Result=(SELECT 1 from OPENROWSET('SQLNCLI11', 'Server=SERVERNAME;UID=username;--Pwd=password;','Exec spUpdateCustomerBilling 1,1')) 

SELECT @Receipts=COALESCE(CASE WHEN @Receipts<>'' 
     THEN @Receipts+', '+CurrencyMaster.Code+' '+CONVERT(VARCHAR,Outstanding.Amount) 
     ELSE CurrencyMaster.Code+' '+CONVERT(VARCHAR,Outstanding.Amount) END,'') 
FROM (SELECT * FROM dbo.fnGetOutstandingByCurrencyAsTable (@CustomerID)) Outstanding 
INNER JOIN CurrencyMaster ON CurrencyMaster.CurrencyID=Outstanding.CurrencyID 

RETURN @Receipts 

END 

ответ

0

Скадрируйте ниже запрос, который не работает как 'динамический SQL' ,
Выполнить тот же затем захватить результирующее значение в вашей переменной @result

DECLARE @CustomerID INT = 50
ЗАЯВЛЯЮ @result INT

SET @sql = 'SELECT @Result= 1 from OPENROWSET(''SQLNCLI11'',''Server=SERVERNAME;UID=username;Pwd=password;'',''Exec spUpdateCustomerBilling ' 
      + Cast(@CustomerID AS VARCHAR(10)) + ',1'')' 

PRINT @sql 

EXEC Sp_executesql 
    @sql, 
    N'@Result int output', 
    @Result output 
+0

Объявляет @sql varible с типом данных NVARCHAR (макс) – knkarthick24

+0

использование EXEC не допускается в функциях –

+0

Exec не разрешен в функциях, но он разрешен в хранимых процедурах, поэтому вы можете просто переписать свою функцию как хранимую процедуру, которая перенастраивает набор результатов. – knkarthick24