coldfusion - 是否可以将存储过程结果传递给 ColdFusion 中的另一个 cfstoredproc?
问题描述
我想将存储过程结果传递给 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>
解决方案
第二个查询真的不是查询。它不能被做成存储过程,因为它不在数据库服务器上运行。也就是说dbtype="query"
不在DB服务器上
此外,您可以过滤掉这些数据。
曾是
<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-mr/queryfilter.html
基于注释的代码
get = request.getYN.filter(function () {
return (lang_code == this.lang && yn_code == code);
}).yn_description;
顺便说一句:除非该字段是大文本、varchar(max) 或 xml,否则选择一个或全部通常很重要
推荐阅读
- druid - 如何使用德鲁伊在 apache 超集中设置指标“HLLSketchMerge”
- python - 从数据集中获取列名
- c# - 如何对 IQueryable 中的派生列进行排序
- julia - 我们如何在 Julia 语言中表示 Python/numpy 函数“zeros_like”
- botframework - 自适应卡片显示在 cortana 频道上不显示,但在团队和模拟器上运行良好
- python - Need to extract all links from script tag HTML Python
- javascript - Sass 中的三和号
- angular - Angular-cli 和 Ckeditor4 自定义构建
- python - 将原始硬盘映像从 S3 存储桶转换为 EC2 映像
- c# - 打开 OpenFileDialog 以更改 PropertyGrid 控件中的属性值?