Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将列表传递给SQL自定义类型_Sql_Sql Server_Stored Procedures_Coldfusion_Coldfusion 10 - Fatal编程技术网

将列表传递给SQL自定义类型

将列表传递给SQL自定义类型,sql,sql-server,stored-procedures,coldfusion,coldfusion-10,Sql,Sql Server,Stored Procedures,Coldfusion,Coldfusion 10,我想在SQLServer2008R2上传递从Coldfusion 10到存储过程的学年列表。我在MSSQL中创建了一个自定义类型: CREATE TYPE YearListType AS Table (years VARCHAR(10)) 然后我的存储过程在存储过程中声明: CREATE PROCEDURE [getCounts] @years YearListType readonly .... SELECT ....... WHERE school_year

我想在SQLServer2008R2上传递从Coldfusion 10到存储过程的学年列表。我在MSSQL中创建了一个自定义类型:

CREATE TYPE YearListType AS Table (years VARCHAR(10))
然后我的存储过程在存储过程中声明:

CREATE PROCEDURE [getCounts]
    @years YearListType readonly
    ....
    SELECT .......
    WHERE school_year IN (SELECT * FROM @years)
现在在我的Coldfusion中,我这样调用存储过程:

<cfstoredproc procedure="[getCounts]" datasource="...">
    <cfprocparam cfsqltype="cf_sql_varchar" value="#yrlist#">
     ....
 </cfstoredproc>
执行时,我得到一个CF错误:

Operand type clash: varchar is incompatible with YearListType 
我理解这个错误,但我不知道如何通过列表。我尝试将list=yes添加到cfprocparam中,但我收到一个错误,表示list参数与cfprocparam不兼容。据我所知,没有cf_sql_列表类型,是吗

如何将值列表传递给存储过程?我甚至应该使用自定义SQL数据类型吗


我读过,也读过,但我想不出它的冷融合的一面

ColdFusion没有的列表属性,但它有的。因此,您可以尝试使用sql语句调用存储过程,就像在SQLServerManagementStudio中一样,并使用来包装参数


这仍然不能解决ColdFusion不能理解SQL Server自定义数据类型的问题。如果您是以编程方式而不是通过用户输入生成年度列表,或者在使用之前对用户输入进行清理,则可以从中省略cfsqltype属性

我以前做过。首先需要创建一个函数来拆分列表,然后像这样在SQL中调用它。FTR:这不是我创造的,我几年前通过谷歌找到的。如果我有原始的源链接,我会引用那些hre。我相信谷歌仍然拥有它们。只需搜索T-SQL

SELECT blah FROM foo WHERE bar IN (fnSplit(@valueList, ','))
这是您需要创建的函数

USE [DBNAME]
GO

/****** Object:  UserDefinedFunction [dbo].[fnSplit]    Script Date: 09/06/2011 19:08:22 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[fnSplit](
        @sInputList VARCHAR(8000) -- List of delimited items
        , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
        ) RETURNS @List TABLE (item VARCHAR(8000))

    BEGIN
            DECLARE @sItem VARCHAR(8000)
            WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
            BEGIN
            SELECT
            @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
            @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

            IF LEN(@sItem) > 0
            INSERT INTO @List SELECT @sItem
            END

            IF LEN(@sInputList) > 0
            INSERT INTO @List SELECT @sInputList -- Put the last item in
            RETURN
        END
GO

您可能需要传递proc并让proc预期~a varchar,然后在proc本身中将varchar转换为YearListType。这真的是最干净的方法吗?难道没有其他人将CF列表传递给存储过程吗?自从TVPs引入SQL Server 2008以来,ColdFusion是否已更新?他们有关于表值参数的文档吗?也可以从中查看和查找。不是不能传递列表,而是不能传递YearListType,我猜这是您定义的自定义类型。再想想,我不认为强制转换是一种选项,因为它似乎是某种表类型。但是,如前所述,您始终可以将参数类型设置为varchar。然后使用多种拆分技术之一,例如,将csv列表转换为行。结果可以像表格一样使用,类似于您当前的方法。我甚至应该使用自定义SQL数据类型吗?不确定使用拆分方法有什么好处。是的,我记得使用了与早期版本SQL Server类似的方法。有人使用一些简洁的XML技巧来实现相同的结果。这基本上是我们在SQL Server 2008上所做的,不是我想要的答案,但我认为这可能是最好的。谢谢,这里有更好的选择,当你不能使用TVPs时,
USE [DBNAME]
GO

/****** Object:  UserDefinedFunction [dbo].[fnSplit]    Script Date: 09/06/2011 19:08:22 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[fnSplit](
        @sInputList VARCHAR(8000) -- List of delimited items
        , @sDelimiter VARCHAR(8000) = ',' -- delimiter that separates items
        ) RETURNS @List TABLE (item VARCHAR(8000))

    BEGIN
            DECLARE @sItem VARCHAR(8000)
            WHILE CHARINDEX(@sDelimiter,@sInputList,0) <> 0
            BEGIN
            SELECT
            @sItem=RTRIM(LTRIM(SUBSTRING(@sInputList,1,CHARINDEX(@sDelimiter,@sInputList,0)-1))),
            @sInputList=RTRIM(LTRIM(SUBSTRING(@sInputList,CHARINDEX(@sDelimiter,@sInputList,0)+LEN(@sDelimiter),LEN(@sInputList))))

            IF LEN(@sItem) > 0
            INSERT INTO @List SELECT @sItem
            END

            IF LEN(@sInputList) > 0
            INSERT INTO @List SELECT @sInputList -- Put the last item in
            RETURN
        END
GO