Я хотел бы передать результат хранимой процедуры другой хранимой процедуре в 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>
Выше приведен пример кода. Во второй хранимой процедуре я передаю результат первой хранимой процедуры в dbvarname sqlStatement второй хранимой процедуры. Но переданное значение #getYN# должно быть запросом, а не результатом, потому что я использую его для предложения FROM.
Вторая хранимая процедура в 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>
<cfquery>
. Сказав это, я бы рекомендовал выполнить<CFDump>
после первого запроса, выбрать переменные и передать их следующему. Я не уверен, что должна делать хранимая процедура, чего не могут сделать более простые методы. - person James A Mohler   schedule 21.11.2018codereview.stackexchange.com
, но я надеюсь, вы в курсе, что вы пишете в два раза больше кода, и он выйдет менее безопасным. Подозреваю, что работать будет медленнее. - person James A Mohler   schedule 21.11.2018FROM
к запросу может быть очень опасным. По крайней мере, я бы добавил какой-то черный список, чтобы предотвратить доступ к системным таблицам, или, что предпочтительнее, белый список, чтобы разрешить доступ только к тем таблицам, к которым вы хотите получить доступ. Или, что еще лучше, внимательно изучите разрешения пользователей дляEXECUTE
иSELECT
. Кроме того, можете ли вы объединить две хранимые процедуры в одну sproc? Какой вкус и версия SQL? - person Shawn   schedule 21.11.2018