将整数列表传递给存储过程

Dan*_*cuk 5 sql-server coldfusion

这是我的存储过程:

ALTER PROCEDURE [dbo].[Dan] 
@numbers varchar(10)    
AS
BEGIN
SET NOCOUNT ON;
select @numbers numbers
END
Run Code Online (Sandbox Code Playgroud)

在SSMS中,我可以像这样成功执行它:

exec dbo.Dan '1.2' 
Run Code Online (Sandbox Code Playgroud)

在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>
Run Code Online (Sandbox Code Playgroud)

但是,我希望通过将值指定为整数列表来改进这一点.由于cfprocparam没有list属性,我认为我仅限于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.
Run Code Online (Sandbox Code Playgroud)

如前所述,我可以将列表作为字符串传递,但这似乎有点像黑客.有没有办法将整数列表作为整数列表传递?

rod*_*era 7

正如其他评论者之前提到的,传递表值参数是一种可行的方法。这将要求您更改 SP 中的输入以获取表输入,并且您可以在查询中执行

<cfquery>
    CREATE TABLE @temp (usedID int)
    INSERT INTO @temp 
        (usedID)
        VALUES
        (1)
        ,(2)

    exec dbo.Dan @temp
</cfquery>
Run Code Online (Sandbox Code Playgroud)

您可能需要更改将参数传递给 SP 的方式,但这是总体思路。


Dan*_*cuk 1

Rodmunera的答案有正确的总体思路。这就是我最终让它发挥作用的方法。

在 sql server 中,我是这样开始的:

CREATE  TYPE pt.IntegerTableType AS TABLE 
( integerIN int);
grant execute on type::pt.IntegerTableType to theAppropriateRole
Run Code Online (Sandbox Code Playgroud)

然后我将存储过程更改为:

ALTER PROCEDURE [dbo].[Dan] 
@numbers pt.IntegerTableType readonly
AS
BEGIN
SET NOCOUNT ON;
select 1 record 
where 1 in (select integerIN from @numbers) 
END
Run Code Online (Sandbox Code Playgroud)

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#">
Run Code Online (Sandbox Code Playgroud)