Vraag : Oproepen een opgeslagen procedure die een CURSEUR van een opgeslagen procedure bevatten

Ik moet één opgeslagen procedure van binnen een andere uitvoeren. Ik kan dit met één uitzondering met succes doen en dat is wanneer de geroepen opgeslagen procedure een CURSEUR gebruikt om het resultaat terug te keren. Ik heb overvloed van opgeslagen procedures die anderen roepen en de output van hen opnemen maar in dit geval ik moet een reeks verbonden verslagen in één enkele curseur string.

The aaneenschakelen om dit werk te doen, d.w.z. Ik kan aantonen dat het het correcte koord terugkeert maar wanneer ik de opgeslagen procedure uitvoer die de curseur bevatten word ik slechts het resultaat van de curseur. Ik hoop ik werkelijk eenvoudig iets hier en dat iemand heb dat answer.

I de code voor beide opgeslagen procedures hebben vastgemaakt, de resultaten van de binnen opgeslagen procedure (die de curseur bevatten) heb gemist, de output van de binnen opgeslagen procedure aantonen die dat het werk en sommige SQL resultaten die van de Analysator van de Vraag twee resultaatreeksen eerder dan zullen voor de roepende opgeslagen hulp procedure.

Any zeer gewaardeerd worden.
" codeBody "
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
" notpretty "
/* dit is de OUTER/CALLING opgeslagen procedure */

/*
	De Naam van de procedure:	usp_NewProductForm_Print_Document_By_DocumentID
	Auteur:			Peter Stanford
	Geschreven datum:		8 Oktober 2006
	Beschrijving:		Deze Procedure keert een lijst van de Vormen van het Nieuwe Product terug
	Laatst bijgewerkt:		
	De Geschiedenis van de verandering:		
	7 Maart 2010 Toegevoegde Description_2 en Description_3
*/
CRE�ëR PROCEDURE dbo.usp_NewProductForm_Print_Document_By_DocumentID
	@DocumentID als geheel
ZOALS


VERKLAAR @Warehouse_List varchar (1000)

EXEC die @DocumentID, @Warehouse_ListOUTPUT usp_NewProductForm_Select_Warehouse_List_For_Printing

SELECTEER 
	a.ID,
	COMPUTER-AIDED SOFTWARE ENGINEERING a.OwnManufacture WANNEER 1 TOEN „ja“ ANDERS „Geen“ EIND als „OwnManufacture“,
	ZET (om klusje (6), a.APDApprovalNumber) + ''+
	ZET (om klusje (20), g.Customer) + ''+ 
	ZET (om klusje (20), g.ProposedCodeNumber) + ''+ 
	ZET (klusje (10), g.DateClosed, 103) om als „APDApprovalNumber“,
	COMPUTER-AIDED SOFTWARE ENGINEERING b.Name WANNEER ONGELDIG TOEN „geselecteerd niet“ ANDERS EIND b.Name als „RequestedBy“,
	COMPUTER-AIDED SOFTWARE ENGINEERING c.Name WANNEER ONGELDIG TOEN „geselecteerd niet“ ANDERS EIND c.Name als „Tak“,
	ZET (varchar (10), a.NPFDate, 103) om als „NPFDate“,
	a.ReasonForProposal,
	a.ProductCode,
	COMPUTER-AIDED SOFTWARE ENGINEERING d.Name WANNEER ONGELDIG TOEN „geselecteerd niet“ ANDERS EIND d.Name als „GroupCode“,
	a.ColoursAndSizes,
	a.Description,
	COMPUTER-AIDED SOFTWARE ENGINEERING e.Name WANNEER ONGELDIG TOEN „geselecteerd niet“ ANDERS EIND e.Name als „StockType“,
	COMPUTER-AIDED SOFTWARE ENGINEERING f.Name WANNEER ONGELDIG TOEN „geselecteerd niet“ ANDERS EIND f.Name als „SalesType“,
	COMPUTER-AIDED SOFTWARE ENGINEERING l.Name WANNEER ONGELDIG TOEN „geselecteerd niet“ ANDERS EIND l.Name als „SalesUnitOfMeasure“,
	a.PackQuantity,
	a.SupplierName,
	a.SupplierNumber,
	a.SupplierStockCode,
	COMPUTER-AIDED SOFTWARE ENGINEERING m.Name WANNEER ONGELDIG TOEN „geselecteerd niet“ ANDERS EIND m.Name als „SupplierUnitOfMeasure“,
	a.ConversionFactor,
	a.SupplierPackQuantity,
	a.EstimatedLeadTimeDays,
	a.EconomicOrderQuantity,
	a.MinimumQuantity,
	a.MaximumQuantity,
	a.CurrentBuyPrice,
	a.QuantityPerUnit,
	a.Currency,
	a.SellingPrice01,
	a.SellingPrice02,
	a.SellingPrice03,
	a.SellingPrice04,
	ZET (varchar (10), a.ForecastStartDate, 103) om als „ForecastStartDate“,
	a.ForecastPeriod01,
	a.ForecastPeriod02,
	a.ForecastPeriod03,
	a.ForecastPeriod04,
	a.ForecastPeriod05,
	a.ForecastPeriod06,
	a.APN,
	a.ExchangeRateApproved,
	a.DutyRate,
	a.OverseasFreight,
	a.LocalCosts,
	COMPUTER-AIDED SOFTWARE ENGINEERING h.Name TOEN ONGELDIG „TOEN nog niet“ ANDERS EIND h.Name als „MaterialsManagerApproval“ goedkeurde,
	ZET (varchar (10), a.MaterialsManagerApprovalDate, 103) om als „MaterialsManagerApprovalDate“,
	a.LastUpdated,
	a.UpdatedBy,
	COMPUTER-AIDED SOFTWARE ENGINEERING a.ProntoChanged WANNEER 0 DAN „Geen“ ANDERS „ja“ als „ProntoChanged“ BEËINDIGT,
	COMPUTER-AIDED SOFTWARE ENGINEERING a.Rejected TOEN 0 TOEN COMPUTER-AIDED SOFTWARE ENGINEERING a.DateClosed TOEN ONGELDIGE TOEN '' ANDERS „Dit document door“ + r.Name + "aan" + het EIND van de varchar BEKEERLING werd gesloten ((10), a.DateClosed, 103) ANDERS „Dit document door“ + r.Name + "aan" + het EIND van de varchar BEKEERLING ((10), a.DateClosed, 103) als Status werd verworpen,
	ZET (varchar (10), a.DateClosed, 103) om als „DateClosed“,
	COMPUTER-AIDED SOFTWARE ENGINEERING r.Name WANNEER ONGELDIG TOEN „Gesloten niet“ ANDERS EIND r.Name als „ClosedBy“,
	COMPUTER-AIDED SOFTWARE ENGINEERING k.Name WANNEER ONGELDIG TOEN „geselecteerd niet“ ANDERS EIND k.Name als „CountryOfOrigin“,
	a.AHECCImport,
	a.AHECCExport,
	a.EachWeight,
	a.CartonQuantity,
	a.CartonWeight,
	a.PalletQuantity,
	a.CartonHeight,
	a.CartonWidth,
	a.CartonDepth,
	a.CartonsPerLayer,
	a.MaximumHeight,
	a.MaximumLayers,
	COMPUTER-AIDED SOFTWARE ENGINEERING n.Name WANNEER ONGELDIG TOEN „Geselecteerd niet“ ANDERS EIND n.Name als „ABCClassification“,
	a.Description_2,
	a.Description_3,
	a.OuterPackQuantity,
	@WAREHOUSE_LIST VAN HET COMPUTER-AIDED SOFTWARE ENGINEERING WANNEER ONGELDIG TOEN '' ANDERS @WAREHOUSE_LISTEIND ALS „Warehouse_List“
VAN 
	(((((((((((NewProductForms a	
				LINKER BUITEN WORDT lid van Personeel B op b.ID = a.RequestedBy)
				LINKER BUITEN SLUIT zich aan bij Plaatsen c op c.ID = a.Branch)
				LINKER BUITEN SLUIT zich aan bij ProductGroup D op d.ID = a.GroupCode)
				LINKER BUITEN SLUIT zich aan bij StockType e op e.ID = a.StockType)
				LINKER BUITEN SLUIT zich aan bij SalesType F op f.ID = a.SalesType)
				LINKER BUITEN WORDT lid van Personeel h op h.ID = a.MaterialsManagerApproval)
				LINKER BUITEN WORDT lid van Personeel r op r.ID = a.ClosedByID)
				LINKER BUITEN SLUIT zich aan bij ProductDevelopmentApplications g op g.ID = a.APDApprovalNumber)
				LINKER BUITEN WORDT lid van Land k op k.ID = a.CountryOfOrigin)
				LINKER BUITEN SLUIT zich aan bij SalesUOM l op l.ID = a.SalesUnitOfMeasure)
				LINKER BUITEN SLUIT zich aan bij SupplierUOM m op m.ID = a.SupplierUnitOfMeasure)
				LINKER BUITEN SLUIT zich aan bij ABC_Class n op n.ID = a.ABCClassification
WAAR
	a.ID = @DocumentID
TERUGKEER 0
GA

/* dit is de INNER/CALLED opgeslagen procedure */

/*
	De Naam van de procedure:	het usp_NewProductForm_Select_Warehouse_List_For_Printing
	Auteur:			Peter Stanford
	Geschreven datum:		1 Augustus 2010
	Beschrijving:		Deze Procedure keert een lijst van Pakhuizen voor druk op PDF terug
	Laatst bijgewerkt:		

*/
CRE�ëR het usp_NewProductForm_Select_Warehouse_List_For_Printing van de PROCEDURE 
	@DocumentID geheel,
	@Warehouse_List varchar (1000) OUTPUT
ZOALS

BEGIN

VERKLAAR CURSEUR Warehouse_Cursor VOOR

SELECTEER 
	COMPUTER-AIDED SOFTWARE ENGINEERING a.Name WANNEER ONGELDIG TOEN EIND '' ANDERS a.Name als Naam
VAN
	Warehouse_FG LINKER BUITEN SLUIT zich aan bij NPF_FGWarehouse B op b.WarehouseID = a.ID
WAAR
	b.NPFID = @DocumentID
ORDE DOOR Naam


OPEN Warehouse_Cursor

VASTGESTELDE NOCOUNT 

@Warehouse_List/*SET = NULL*/

VERKLAAR @Name varchar (50)

HAAL DAARNA VAN 
	Warehouse_Cursor 
IN 
	@Name

TERWIJL @@FETCH_STATUS = 0 BEGINNEN
	SELECTEER @Warehouse_List = @Warehouse_List + @Name + „,“

HAAL DAARNA VAN 
	Warehouse_Cursor 
IN 
	@Name
EIND

EIND

SELECTEER @Warehouse_List

SLUIT Warehouse_Cursor

DEALLOCATE Warehouse_Cursor
GA
Related Oplossingen: het Coderen van de

Antwoord : Oproepen een opgeslagen procedure die een CURSEUR van een opgeslagen procedure bevatten

Asside van de twijfelachtige verdiensten van die binnen Opgeslagen Procedure die in wanhopige behoefte om opnieuw te coderen is, u vergelijkt appelen bij sinaasappelen. Wanneer u het test doet u het als dit:

EXEC die 1, '' usp_NewProductForm_Select_Warehouse_List_For_Printing

Maar toch wanneer u het roept, doet u het als dit:
EXEC die @DocumentID, @Warehouse_ListOUTPUT usp_NewProductForm_Select_Warehouse_List_For_Printing

Aangezien @Warehouse_List ONGELDIG en nooit geïnitialiseerdg is, is dat precies de waarde u, ongeacht uw ongeldig gebruik van UITGEZOCHTE @Warehouse_List aan het eind van de Opgeslagen Procedure gaat terugkrijgen.

Zo als u enkel probeert om de code te bevestigen zodat het het probleem oplost eerder dan om het probleem te bevestigen: dan hebt u iniitialize de waarde ergens van @Warehouse_List nodig.

Bijvoorbeeld kunt u één van de volgende opties doen:
1. In uw buiten Opgeslagen Procedure:
VERKLAAR @Warehouse_List varchar (1000)

PLAATS @Warehouse_List = ''                -- voeg deze lijn toe

EXEC die @DocumentID, @Warehouse_ListOUTPUT usp_NewProductForm_Select_Warehouse_List_For_Printing

2. In uw Binnen Opgeslagen Procedure
VASTGESTELDE NOCOUNT

@Warehouse_List/*SET = NULL*/
VASTGESTELDE @Warehouse_List = ''                -- voeg deze lijn toe

VERKLAAR @Name varchar (50)

3.  Verander deze lijn in de Binnen Opgeslagen Procedure:
    BEGIN
        -- SELECTEER @Warehouse_List = @Warehouse_List + @Name + „,“
        SELECTEER @WAREHOUSE_LIST = ISNULL (@WAREHOUSE_LIST, '') + @NAME + „,“           -- Verander deze lijn
        HAAL DAARNA VAN Warehouse_Cursor IN @Name
    EIND

En wanneer u een kans krijgt gelieve te herschrijven dat Opgeslagen Procedure of te zet het beter nog in een UDF om.
Andere oplossingen  
 
programming4us programming4us