Можно ли передать результат хранимой процедуры другому cfstoredproc в ColdFusion? - PullRequest
0 голосов
/ 20 ноября 2018

Я хотел бы передать результат хранимой процедуры другой хранимой процедуре в ColdFusion.Если кто-нибудь сможет помочь в этом.

<cfif not isDefined("getYN")>
     <cfstoredproc procedure="stored_proc" datasource="#dsn#">
        <cfprocparam cfsqltype="cf_sql_varchar" dbvarname="@lang" type="in" value="#this.lang#"/>
        <cfprocparam cfsqltype="cf_sql_varchar" dbvarname="@sqlStatement" type="in" value="#getYN#" null="#NOT len(trim(getYN))#" />            
        <cfprocresult name="getYN" resultset = "1">
     </cfstoredproc>
</cfif>

<cfstoredproc procedure="sp_test" datasource="#dsn#">
        <cfprocparam cfsqltype="cf_sql_varchar" dbvarname="@lang" type="in" value="#this.lang#"/>
        <cfprocparam cfsqltype="cf_sql_varchar" dbvarname="@sqlStatement" type="in" value="#getYN#" null="#NOT len(trim(getYN))#" />            
        <cfprocresult name="get" resultset = "2">
 </cfstoredproc>

Выше приведен пример кода.Во второй хранимой процедуре я передаю результат 1-й хранимой процедуры в dbvarname sqlStatement 2-й хранимой процедуры.Но переданное значение # getYN # должно быть запросом, а не результатом, потому что я использую его для предложения FROM.

2-я хранимая процедура в SQL Server выглядит следующим образом:

ALTER PROCEDURE [dbo].[sp_test]
    @lang CHAR(5),
    @code VARCHAR(20),
    @sqlStatement NVARCHAR(MAX) = NULL
AS
BEGIN
    SET NOCOUNT ON;

    DECLARE @sSQL nVARCHAR(max)

    SET @sSQL = '   SELECT col1
             FROM '+ @sqlStatement +
           ' WHERE col2 = @lang
              AND col3 = @code '

    EXECUTE SP_EXECUTESQL @sSQL, N'@lang CHAR(5),
                           @code VARCHAR(20)', @lang, @code ;

    SET NOCOUNT OFF;
END

Кроме того, из приведенного ниже кода создаются два вышеупомянутых кода, которые заменяют его на cfstoredproc вместо cfquery:

<cfif NOT isDefined("request.getYN")>

        <cfquery name="request.getYN" datasource="#request.dsn.pqr#">

SELECT
    LANGUAGE_CODE                ,
    YN_CODE                ,
    YN_DESCRIPTION          
FROM
    LANGUAGE_ALTS_YN          
WHERE
    language_code IN (
        'EN','#this.lang#'
    )        
        </cfquery>
    </cfif>

    <cfquery name="get" dbtype="query">

SELECT
    yn_description        
FROM
    request.getYN        
WHERE
    language_code =
<cfqueryparam cfsqltype="cf_sql_varchar" value="#this.lang#" />         
    AND yn_code = <cfqueryparam cfsqltype="cf_sql_varchar" 
     value="#arguments.code#" />      
     </cfquery>

1 Ответ

0 голосов
/ 22 ноября 2018

Второй запрос действительно не является запросом.Его нельзя превратить в хранимую процедуру, потому что он не работает на сервере базы данных.Другими словами dbtype="query" не на сервере БД

Кроме того, вы можете просто отфильтровать эти данные.

Was

<cfquery name="get" dbtype="query">

 SELECT yn_description        
 FROM
    request.getYN        
 WHERE
   language_code = <cfqueryparam cfsqltype="cf_sql_varchar" value="#this.lang#" />
   AND yn_code = <cfqueryparam cfsqltype="cf_sql_varchar" 
   value="#arguments.code#" />      
 </cfquery>

Должно быть

get = request.getYN.filter(function () {
   return (lang_code == this.lang && yn_code == code);
   });

Примечание: этот код во второй строке не ограничен.Это не ошибка.

Фильтры запросов см .: https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-m-r/queryfilter.html

Код на основе комментария

get = request.getYN.filter(function () {
   return (lang_code == this.lang && yn_code == code);
   }).yn_description;

Кстати: если не указано полебольшой текст, varchar (max) или xml. Обычно имеет значение, выбираете ли вы один или все

...