Frage : Ein gespeichertes Verfahren benennen, das einen CURSOR von einem gespeicherten Verfahren enthält

Ich muss ein gespeichertes Verfahren von innerhalb anderen durchführen. Ich kann dies mit einer Ausnahme erfolgreich tun und die ist, wenn das benannte gespeicherte Verfahren einen CURSOR benutzt, um das Resultat zurückzubringen. Ich habe viel der gespeicherten Verfahren, die andere benennen und den Ausgang von ihnen aufheben, aber in diesem Fall muss ich eine Reihe verbundene Aufzeichnungen in einen einzelnen string.

The Cursor verketten, um dies zu tun Arbeiten, d.h. Ich kann zeigen, dass er die korrekte Schnur zurückbringt, aber, wann ich das gespeicherte Verfahren durchführe, das nur den Cursor ich enthält, das Resultat vom Cursor erhalten. Ich bin hoffend ich habe verfehlt etwas, das hier wirklich einfach ist und dieser jemand hat, dass answer.

I den Code für beide gespeicherten Verfahren angebracht haben, die Resultate vom inneren gespeicherten Verfahren (das, das den Cursor enthält), der Ausgang der inneren Vertretung des gespeicherten Verfahrens, die es funktioniert und einige SQL-Fragen-Analysatorresultate, die zwei Resultatssätze eher als einer für die benennende gespeicherte procedure.

Any Hilfe zeigen, werden sehr geschätzt.
Results für INNERES gespeichertes Procedure
 332516
" L class= >
Results für ÄUSSERES (benennendes) gespeichertes Procedure
 das 332517
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:
6:
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:
/* dieses ist das OUTER/CALLING gespeicherte Verfahren *

/*
	Verfahrens-Name:	usp_NewProductForm_Print_Document_By_DocumentID
	Autor:			Peter Stanford
	Datum geschrieben:		8. Oktober 2006
	Beschreibung:		Rückkehr dieses Verfahrens eine Liste der neues Produkt-Formen
	Letzter Update:		
	Änderungs-Geschichte:		
	7. März 2010 addiertes Description_2 und Description_3
*
VERFAHREN dbo.usp_NewProductForm_Print_Document_By_DocumentID VERURSACHEN
	@DocumentID als ganze Zahl
WIE


Das varchar @Warehouse_List ERKLÄREN (1000)

EXEC usp_NewProductForm_Select_Warehouse_List_For_Printing @DocumentID, @Warehouse_List OUTPUT

AUSERWÄHLT 
	a.ID,
	FALL a.OwnManufacture, WENN 1 DANN „ja“ SONST „nicht“ ENDE als „OwnManufacture“,
	BEKEHRTER (Putzfrau (6), a.APDApprovalNumber) + ''+
	UMWANDELN (Putzfrau (20), g.Customer) + ''+ 
	UMWANDELN (Putzfrau (20), g.ProposedCodeNumber) + ''+ 
	UMWANDELN (Putzfrau (10), g.DateClosed, 103) als „APDApprovalNumber“,
	b.Name UMKLEIDEN, WENN vorgewähltes“ SONST b.Name ENDE DER NULL-DANN „nicht als „RequestedBy“,
	c.Name UMKLEIDEN, WENN vorgewähltes“ SONST c.Name ENDE DER NULL-DANN „nicht als „Niederlassung“,
	UMWANDELN (varchar (10), a.NPFDate, 103) als „NPFDate“,
	a.ReasonForProposal,
	a.ProductCode,
	UMKLEIDET d.Name, WENN vorgewähltes“ SONST d.Name ENDE DER NULL-DANN „nicht als „GroupCode“,
	a.ColoursAndSizes,
	a.Description,
	UMKLEIDET e.Name, WENN vorgewähltes“ SONST e.Name ENDE DER NULL-DANN „nicht als „StockType“,
	f.Name UMKLEIDEN, WENN vorgewähltes“ SONST f.Name ENDE DER NULL-DANN „nicht als „SalesType“,
	l.Name UMKLEIDEN, WENN vorgewähltes“ SONST l.Name ENDE DER NULL-DANN „nicht als „SalesUnitOfMeasure“,
	a.PackQuantity,
	a.SupplierName,
	a.SupplierNumber,
	a.SupplierStockCode,
	UMKLEIDET m.Name, WENN vorgewähltes“ SONST m.Name ENDE DER NULL-DANN „nicht 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,
	WANDELN um (varchar (10), a.ForecastStartDate, 103) als „ForecastStartDate“,
	a.ForecastPeriod01,
	a.ForecastPeriod02,
	a.ForecastPeriod03,
	a.ForecastPeriod04,
	a.ForecastPeriod05,
	a.ForecastPeriod06,
	a.APN,
	a.ExchangeRateApproved,
	a.DutyRate,
	a.OverseasFreight,
	a.LocalCosts,
	UMKLEIDEN h.Name, ALS NULL DANN „nicht schon“ SONST h.Name ENDE als „MaterialsManagerApproval“ genehmigte,
	UMWANDELN (varchar (10), a.MaterialsManagerApprovalDate, 103) als „MaterialsManagerApprovalDate“,
	a.LastUpdated,
	a.UpdatedBy,
	UMKLEIDET a.ProntoChanged, WENN 0 DANN „nicht“ SONST „ja“ ENDE als „ProntoChanged“,
	a.Rejected UMKLEIDEN, WENN 0 DANN a.DateClosed UMKLEIDEN, ALS NULL DANN '' SONST „dieses Dokument durch“ + r.Name + "ON" + BEKEHRTER geschlossen wurde (varchar (10), a.DateClosed, 103) ENDE SONST „dieses Dokument wurde durch“ + r.Name + "ON" + BEKEHRTER zurückgewiesen (varchar (10), a.DateClosed, 103) ENDE als Status,
	UMWANDELN (varchar (10), a.DateClosed, 103) als „DateClosed“,
	r.Name UMKLEIDEN, ALS NULL DANN „nicht“ SONST r.Name ENDE als „ClosedBy“ schloß,
	k.Name UMKLEIDEN, WENN vorgewähltes“ SONST k.Name ENDE DER NULL-DANN „nicht 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,
	UMKLEIDET n.Name, WENN vorgewähltes“ SONST n.Name ENDE DER NULL-DANN „nicht als „ABCClassification“,
	a.Description_2,
	a.Description_3,
	a.OuterPackQuantity,
	UMKLEIDET @Warehouse_List, WENN NULL DANN '' SONST @Warehouse_List ENDE als „Warehouse_List“
VON 
	(((((((((((NewProductForms a	
				LINKE ÄUSSERE VERBINDEN Stab b auf b.ID = a.RequestedBy)
				LINKE ÄUSSERE SCHLIESSEN sich Positionen c auf c.ID = a.Branch) an
				LINKE ÄUSSERE VERBINDEN ProductGroup d auf d.ID = a.GroupCode)
				LINKE ÄUSSERE VERBINDEN StockType e auf e.ID = a.StockType)
				LINKE ÄUSSERE VERBINDEN SalesType f auf f.ID = a.SalesType)
				LINKE ÄUSSERE VERBINDEN Stab h auf h.ID = a.MaterialsManagerApproval)
				LINKE ÄUSSERE VERBINDEN Stab r auf r.ID = a.ClosedByID)
				LINKE ÄUSSERE VERBINDEN ProductDevelopmentApplications g auf g.ID = a.APDApprovalNumber)
				LINKE ÄUSSERE VERBINDEN Land k auf k.ID = a.CountryOfOrigin)
				LINKE ÄUSSERE VERBINDEN SalesUOM L auf l.ID = a.SalesUnitOfMeasure)
				LINKE ÄUSSERE VERBINDEN SupplierUOM m auf m.ID = a.SupplierUnitOfMeasure)
				LINKE ÄUSSERE VERBINDEN ABC_Class n auf n.ID = a.ABCClassification
WO
	a.ID = @DocumentID
RÜCKKEHR 0
GEHEN

/* dieses ist das INNER/CALLED gespeicherte Verfahren *

/*
	Verfahrens-Name:	usp_NewProductForm_Select_Warehouse_List_For_Printing
	Autor:			Peter Stanford
	Datum geschrieben:		1. August 2010
	Beschreibung:		Rückkehr dieses Verfahrens eine Liste der Lager für Drucken auf dem pdf
	Letzter Update:		

*
Das usp_NewProductForm_Select_Warehouse_List_For_Printing VERFAHREN VERURSACHEN 
	@DocumentID ganze Zahl,
	@Warehouse_List varchar (1000) OUTPUT
WIE

ANFANGEN

Warehouse_Cursor CURSOR FÜR ERKLÄREN

VORWÄHLEN 
	a.Name UMKLEIDEN WENN SONST a.Name ENDE DER NULL-DANN '' als Name
VON
	Warehouse_FG ein LINKES ÄUSSERES VERBINDEN NPF_FGWarehouse b auf b.WarehouseID = a.ID
WO
	b.NPFID = @DocumentID
AUFTRAG namentlich


Warehouse_Cursor ÖFFNEN

NOCOUNT AN EINSTELLEN

/*SET @Warehouse_List = NULL*/

Das varchar @Name ERKLÄREN (50)

ZUNÄCHST VON HOLEN 
	Warehouse_Cursor 
IN 
	@Name

WÄHREND @@FETCH_STATUS = 0 ANFANGEN
	@Warehouse_List = @Warehouse_List + @Name VORWÄHLEN + „,“

ZUNÄCHST VON HOLEN 
	Warehouse_Cursor 
IN 
	@Name
ENDE

ENDE

@Warehouse_List VORWÄHLEN

Warehouse_Cursor SCHLIESSEN

Warehouse_Cursor FREIGEBEN
GEHEN
Related Lösungen: SQL BEDIENER, der bestes Practice kodiert

Antwort : Ein gespeichertes Verfahren benennen, das einen CURSOR von einem gespeicherten Verfahren enthält

Asside von den zweifelhaften Verdiensten dieses inneren gespeicherten Verfahrens, das in der hoffnungslosen Notwendigkeit der Neukodierung ist, vergleichen Sie Äpfel mit Orangen. Wenn Sie sie prüfen, tun Sie sie mögen dieses:

EXEC, die usp_NewProductForm_Select_Warehouse_List_For_Printing sind 1, ''

Jedoch, wenn Sie sie benennen, tun Sie sie mögen dieses:
EXEC usp_NewProductForm_Select_Warehouse_List_For_Printing @DocumentID, @Warehouse_List OUTPUT

Da @Warehouse_List UNGÜLTIG und nie initialisiert ist, ist der genau der Wert, den Sie zurück erhalten werden, unabhängig davon Ihren unzulässigen Gebrauch des AUSERWÄHLTEN @Warehouse_List am Ende des gespeicherten Verfahrens.

So, wenn Sie gerade versuchen, den Code zu regeln, damit er das Problem löst, eher als das Problem regeln: als Sie den Wert von @Warehouse_List irgendwo iniitialize müssen.

Z.B. Sie können eine der folgenden Wahlen tun:
1. In Ihrem äußeren gespeicherten Verfahren:
Das varchar @Warehouse_List ERKLÄREN (1000)

@Warehouse_List EINSTELLEN = ''                -- diese Linie addieren

EXEC usp_NewProductForm_Select_Warehouse_List_For_Printing @DocumentID, @Warehouse_List OUTPUT

2. In Ihrem inneren gespeicherten Verfahren
NOCOUNT AN EINSTELLEN

/*SET @Warehouse_List = NULL*/
@Warehouse_List EINSTELLEN = ''                -- diese Linie addieren

Das varchar @Name ERKLÄREN (50)

3.  Diese Linie im inneren gespeicherten Verfahren ändern:
    ANFANGEN
        -- @Warehouse_List = @Warehouse_List + @Name VORWÄHLEN + „,“
        @WAREHOUSE_LIST = ISNULL (@WAREHOUSE_LIST, '') VORWÄHLEN + @NAME + „,“           -- Diese Linie ändern
        ZUNÄCHST VON Warehouse_Cursor IN @Name HOLEN
    ENDE

Und wenn Sie eine Wahrscheinlichkeit bitte erhalten, neu schreiben dass gespeichertes Verfahren oder Bekehrten es zu einem UDF noch verbessern.
Weitere Lösungen  
 
programming4us programming4us