【发布时间】:2016-12-21 23:52:42
【问题描述】:
我需要将一个列表传递给我的 SQL Server 存储过程。我已经生成了列表,它是一个逗号分隔的数字列表,使用:
<cfquery name="House" datasource="#application.datasource#">
SELECT cGLsubaccount
FROM HOUSE
WHERE Right(cGLsubaccount,3) IN
(
<cfloop index="i" list="#consulsub#">
<cfoutput>#right(Trim(i) , 3)#,</cfoutput>
</cfloop>
00000000
)
</cfquery>
<cfset GLsubacct = Valuelist(House.cGLsubaccount,",")>
现在,我使用cfprocparam 将其传递到存储过程中,并将cfsqltype 设置为varchar(1000)。 (我在谷歌上读到这是将列表传递给存储过程的方法)。
<cfprocparam type="IN" value="#GLsubacct#" DBVARNAME="@GLsubacct" cfsqltype="cf_sql_varchar">
在存储过程中,我是这样做的:
ALTER PROCEDURE [rw].[sp_EFT_NoticeXLS2] (
@Scope varchar(50)
, @AcctPeriod char(6)
, @CompanyID nchar(10)
, @GLsubacct varchar(1000) = NULL
)
AS......
存储过程中的SQL语句如下:
CREATE TABLE #Houses (
iHouse_ID int,
cName varchar(50),
cNumber varchar(10),
cPhoneNumber1 varchar(25),
cAddressLine1 varchar(50),
cCity varchar(30),
cStateCode varchar(2),
cZipCode varchar(10),
iUnitsAvailable int,
iRegOpsNumber int,
cOpsName varchar(50),
iRegionID int,
cRegionName varchar(50)
)
INSERT INTO #Houses (
iHouse_ID,
cName,
cNumber,
cPhoneNumber1,
cAddressLine1,
cCity,
CStateCode,
cZipCode,
iUnitsAvailable,
iRegOpsNumber,
cOpsName,
iRegionID,
cRegionName )
SELECT
h2.iHouse_ID,
h.cName,
h.cNumber,
h.cPhoneNumber1,
h.cAddressLine1,
h.cCity,
h.CStateCode,
h.cZipCode,
h.iUnitsAvailable,
r.RegOpsNumber,
r.opsname,
r.iRegion_ID,
r.regionname
FROM rw.fn_GetScopeHouses (@Scope, @dtReport, NULL, NULL, 0) h2
JOIN House h on h.iHouse_ID = h2.iHouse_ID
AND h.cCompanyID = @CompanyID
AND ( @GLsubacct IS NULL OR h.iHouse_ID IN ('+ @GLsubacct +') )
JOIN rw.vw_Reg_Ops r on r.opsareaID = h.iOpsArea_ID
问题是我遇到了错误。错误信息是...
Error Executing Database Query.
[Macromedia][SQLServer JDBC Driver][SQLServer]Conversion failed when converting the varchar value '+ @GLsubacct +' to data type int.
The error occurred in E:\inetpub\wwwroot\intranet\TIPS4\Admin\EFTprocesspullfile.cfm: line 46
44 : <cfprocparam type="IN" value="#CompanyID#" DBVARNAME="@CompanyID" cfsqltype="cf_sql_varchar"><!--- TPecku added variable to be passed to the stored Proc --->
45 : <cfif CompanyID EQ 0000>
46 : <cfprocparam type="IN" value="#GLsubacct#" DBVARNAME="@GLsubacct" cfsqltype="cf_sql_varchar">
47 : </cfif>
48 : </cfstoredproc>
错误出现在存储过程中,因为我有'+ @GLsubacct +'。 关于我做错了什么的任何想法? (抱歉,这篇文章太长了,我想尽可能详细地说明,以便您了解我在做什么。
【问题讨论】:
-
查看表值参数 (TVP),这可能是您想要使用的,而不是传递字符串。 msdn.microsoft.com/en-us/library/bb510489.aspx
-
感谢 rjdevereux,我查看了您的链接,但我仍然对如何前进感到困惑。
-
好吧,你有几个选择。一种是使用字符串解析功能。这里有很多方法可以做到这一点:sqlperformance.com/2012/07/t-sql-queries/split-strings。一种是将表传递给存储过程。为此,您创建一个类型(如上面的链接中所示),然后将其用作您的过程的
READONLY参数。无论您选择什么选项,您都希望更改您的过程以加入表(拆分值表或您使用的 tvp)。 -
谢谢ZLK。我今天将根据您的建议进行处理,明天将报告我的进度。
-
一个正在使用字符串解析函数 是的。那肯定会。您还应该考虑用这样的方式替换您的第一个查询,因为它在当前形式下很容易受到 sql 注入的攻击。
标签: sql-server stored-procedures coldfusion coldfusion-9