将整数列表传递给存储过程
Pass List of Integers to Stored Procedure
这是我的存储过程:
ALTER PROCEDURE [dbo].[Dan]
@numbers varchar(10)
AS
BEGIN
SET NOCOUNT ON;
select @numbers numbers
END
在SSMS中,我可以这样执行成功:
exec dbo.Dan '1.2'
在 ColdFusion 中,我可以使用这两组命令中的任何一个成功地执行它:
<cfstoredproc procedure="dbo.dan" datasource="ClinicalDataDev">
<cfprocparam cfsqltype="cf_sql_varchar" value="1,2">
<cfprocresult name="abc">
</cfstoredproc>
<cfquery name="abcd" datasource="ClinicalDataDev">
exec dbo.Dan <cfqueryparam cfsqltype="cf_sql_varchar" value='1,2' list="no">
</cfquery>
但是,我希望通过将值指定为整数列表来对此进行改进。由于 cfprocparam 没有列表属性,我认为我仅限于 cfquery 方法。到目前为止,我的努力和结果是:
<cfqueryparam cfsqltype="cf_sql_integer" value='1' list="no">
executes successfully. The purpose is to see if the procedure accepts an
integer - it does.
<cfqueryparam cfsqltype="cf_sql_integer" value='1,2' list="no">
also executes sucessfully, but returns a value of 42006. Probably not
worth persuing.
<cfqueryparam cfsqltype="cf_sql_integer" value='1,2' list="yes">
throws an error for two many paramters.
The same thing happens with cf_sql_varchar.
如前所述,我可以将列表作为字符串传递,但这似乎有点麻烦。有没有办法将整数列表作为整数列表传递?
正如之前提到的其他评论者,传递 table 值参数是可行的方法。这将要求您更改 SP 中的输入以采用 table 输入,并且在您的查询中您可以执行
<cfquery>
CREATE TABLE @temp (usedID int)
INSERT INTO @temp
(usedID)
VALUES
(1)
,(2)
exec dbo.Dan @temp
</cfquery>
您可能需要更改将参数传递给 SP 的方式,但这是一般的想法。
rodmunera 的回答大体思路正确。这是我最终让它工作的方法。
在 sql 服务器中,我是这样开始的:
CREATE TYPE pt.IntegerTableType AS TABLE
( integerIN int);
grant execute on type::pt.IntegerTableType to theAppropriateRole
然后我通过存储过程改成了这样:
ALTER PROCEDURE [dbo].[Dan]
@numbers pt.IntegerTableType readonly
AS
BEGIN
SET NOCOUNT ON;
select 1 record
where 1 in (select integerIN from @numbers)
END
Coldfusion 代码是这样的:
<cfset numbers = "1,2">
<cfquery name="abcd" datasource="ClinicalDataDev">
declare @dan as pt.IntegerTableType
insert into @dan
select null
where 1 = 2
<cfloop list="#numbers#" index="number">
union
select <cfqueryparam cfsqltype="cf_sql_integer" value="#number#">
</cfloop>
exec dbo.Dan @dan
</cfquery>
<cfdump var="#abcd#">
这是我的存储过程:
ALTER PROCEDURE [dbo].[Dan]
@numbers varchar(10)
AS
BEGIN
SET NOCOUNT ON;
select @numbers numbers
END
在SSMS中,我可以这样执行成功:
exec dbo.Dan '1.2'
在 ColdFusion 中,我可以使用这两组命令中的任何一个成功地执行它:
<cfstoredproc procedure="dbo.dan" datasource="ClinicalDataDev">
<cfprocparam cfsqltype="cf_sql_varchar" value="1,2">
<cfprocresult name="abc">
</cfstoredproc>
<cfquery name="abcd" datasource="ClinicalDataDev">
exec dbo.Dan <cfqueryparam cfsqltype="cf_sql_varchar" value='1,2' list="no">
</cfquery>
但是,我希望通过将值指定为整数列表来对此进行改进。由于 cfprocparam 没有列表属性,我认为我仅限于 cfquery 方法。到目前为止,我的努力和结果是:
<cfqueryparam cfsqltype="cf_sql_integer" value='1' list="no">
executes successfully. The purpose is to see if the procedure accepts an
integer - it does.
<cfqueryparam cfsqltype="cf_sql_integer" value='1,2' list="no">
also executes sucessfully, but returns a value of 42006. Probably not
worth persuing.
<cfqueryparam cfsqltype="cf_sql_integer" value='1,2' list="yes">
throws an error for two many paramters.
The same thing happens with cf_sql_varchar.
如前所述,我可以将列表作为字符串传递,但这似乎有点麻烦。有没有办法将整数列表作为整数列表传递?
正如之前提到的其他评论者,传递 table 值参数是可行的方法。这将要求您更改 SP 中的输入以采用 table 输入,并且在您的查询中您可以执行
<cfquery>
CREATE TABLE @temp (usedID int)
INSERT INTO @temp
(usedID)
VALUES
(1)
,(2)
exec dbo.Dan @temp
</cfquery>
您可能需要更改将参数传递给 SP 的方式,但这是一般的想法。
rodmunera 的回答大体思路正确。这是我最终让它工作的方法。
在 sql 服务器中,我是这样开始的:
CREATE TYPE pt.IntegerTableType AS TABLE
( integerIN int);
grant execute on type::pt.IntegerTableType to theAppropriateRole
然后我通过存储过程改成了这样:
ALTER PROCEDURE [dbo].[Dan]
@numbers pt.IntegerTableType readonly
AS
BEGIN
SET NOCOUNT ON;
select 1 record
where 1 in (select integerIN from @numbers)
END
Coldfusion 代码是这样的:
<cfset numbers = "1,2">
<cfquery name="abcd" datasource="ClinicalDataDev">
declare @dan as pt.IntegerTableType
insert into @dan
select null
where 1 = 2
<cfloop list="#numbers#" index="number">
union
select <cfqueryparam cfsqltype="cf_sql_integer" value="#number#">
</cfloop>
exec dbo.Dan @dan
</cfquery>
<cfdump var="#abcd#">