Pass-list nach SQL-benutzerdefinierten Typ

Ich möchte eine list der Schuljahre von Coldfusion 10 zu einer gespeicherten Prozedur auf SQL server 2008 R2 übergeben. Ich habe eine benutzerdefinierte Art in MSSQL erstellt:

CREATE TYPE YearListType AS Table (years VARCHAR(10)) 

Und dann meine gespeicherte Prozedur deklariert dies in meinem gespeicherten Verfahren:

 CREATE PROCEDURE [getCounts] @years YearListType readonly .... SELECT ....... WHERE school_year IN (SELECT * FROM @years) 

Jetzt in meiner Coldfusion, rufe ich die gespeicherte Prozedur auf diese Weise:

 <cfstoredproc procedure="[getCounts]" datasource="..."> <cfprocparam cfsqltype="cf_sql_varchar" value="#yrlist#"> .... </cfstoredproc> 

Die Variable yrlist ist eine durch Kommas getrennte list. Beispielwert sieht aus wie:

 "2001-2002,2002-2003,2003-2004" 

Wenn ich ausführen, bekomme ich einen CF-Fehler:

 Operand type clash: varchar is incompatible with YearListType 

Ich verstehe den Fehler, aber ich weiß nicht, wie sonst die list passieren soll. Ich habe versucht, list = "ja" zum cfprocparam hinzuzufügen, aber ich bekomme einen Fehler, dass der listnparameter nicht mit cfprocparam kompatibel ist. Soweit ich weiß, gibt es keinen cf_sql_list Typ, gibt es?

Wie soll ich eine list von Werten an meine gespeicherte Prozedur übergeben? Soll ich überhaupt einen benutzerdefinierten SQL-datatyp verwenden?

Ich habe das und das gelesen, aber ich kann die Coldfusion-Seite nicht herausfinden.

   

Das habe ich schon mal gemacht Du musst zuerst eine function erstellen, um die list auseinander zu teilen und dann in deinem SQL so zu rufen. FTR: Ich habe das nicht geschafft, ich habe es vor einigen Jahren über Google gefunden. Wenn ich die ursprüngliche Quelllinks hätte, hätte ich diese hre referenziert. Ich bin sicher, dass Google sie noch hat. searchn Sie einfach nach "T-SQL fnSplit".

 SELECT blah FROM foo WHERE bar IN (fnSplit(@valueList, ',')) 

Dies ist die function, die Sie erstellen müssen.

 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 

ColdFusion hat kein Attribut "list" für <cfprocparam> , aber es gilt für <cfqueryparam> . So könnten Sie versuchen, Ihre gespeicherte Prozedur mit einer SQL-statement, wie Sie aus SQL server Management Studio, und verwenden Sie <cfqueryparam> , um Ihre Parameter zu wickeln.

Dies wird immer noch nicht auf das Problem, dass ColdFusion nicht (und kann nicht) SQL server benutzerdefinierte datatypen zu verstehen. Wenn Sie die cfsqltype programmgesteuert anstatt von der Benutzereingabe generieren (oder Sie die Benutzereingabe vor der Verwendung des cfsqltype <cfqueryparam> ), können Sie das Attribut cfsqltype aus <cfqueryparam> .