2015-05-07 13 views
5

यहाँ है मेरी संग्रहीत प्रक्रिया:दर्रा सूची संग्रहित प्रक्रिया

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. 

कि पहले कहा गया है, मैं एक स्ट्रिंग के रूप सूची पारित कर सकते हैं, लेकिन यह एक हैक का एक सा लगता है। पूर्णांक की सूची के रूप में पूर्णांक की सूची को पास करने का कोई तरीका है?

+1

उन्हें पासिंग:

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 कोड यह है:

CREATE TYPE pt.IntegerTableType AS TABLE (integerIN int); grant execute on type::pt.IntegerTableType to theAppropriateRole 

तो मैं यह करने के लिए संग्रहीत proc द्वारा बदला एक वर्चर एक गड़बड़ है। आपको उन्हें उन पूर्णांक में वापस पालना होगा जो अच्छा नहीं है। आप इसके बजाय तालिका मूल्यवान पैरामीटर का उपयोग करने पर एक नज़र रखना चाहते हैं। https://msdn.microsoft.com/en-us/library/bb510489.aspx –

+2

आप ints के रूप में उन्हें वापस पार्स करने के बारे में चिंतित हैं, तो आप भी XML का उपयोग करें और एक स्कीमा के साथ प्रकार लागू कर सकते हैं। हालांकि सिर्फ मेरे दो सेंट के लिए, मैं एक अच्छा स्प्लिटर फ़ंक्शन के साथ हर समय सीमित सूची का उपयोग करता हूं। ऐसा लगता है कि यह टीवीपी की तुलना में कम सिरदर्द आमंत्रित करता है। फिर, आईएमएचओ। – Xedni

+1

मैं coldfusion के बारे में पता नहीं है, लेकिन एसक्यूएल के नजरिए से एक मेज महत्वपूर्ण पैरामीटर जाने का रास्ता है। –

उत्तर

0

rodmunera के जवाब सही सामान्य विचार है। यहां बताया गया है कि आखिरकार मैं इसे काम करने के लिए कैसे मिला।

एसक्यूएल सर्वर में, मैं इस के साथ शुरू किया:

<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#"> 
4

पहले उल्लेख किया है अन्य टिप्पणीकर्ताओं, टेबल-मान पैरामीटर प्रदान करने के रूप में जाने के लिए रास्ता है। इस में सपा इनपुट बदलने के लिए आप की आवश्यकता होती है एक मेज इनपुट लेने के लिए होगा और अपने प्रश्न में आप कर सकते हैं

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

    exec dbo.Dan @temp 
</cfquery> 

आप जिस तरह से आप के लिए सपा अपने पैरामीटर भेजने को बदलने के लिए हो सकता है, लेकिन यह सामान्य है विचार।

+0

अभी तक, मैंने आपको वोट दिया है। अगर आप उत्तर के लिए क्रेडिट चाहते हैं, तो अपने सीएफक्व्यूरी टैग के अंदर एसक्यूएल सर्वर सिंटैक्स को ठीक करें। संदर्भ के रूप में मेरा जवाब देखें। –

संबंधित मुद्दे