Errore in stored procedure (ebook)

lunedì 20 febbraio 2012 - 18.17

jjchuck Profilo | Senior Member

In un testo che sto studiando tento di eseguire la seguente sp che creo tranquillamente:
CREATE PROCEDURE CustomerTotals
@customerID varchar(5),
@customerTotal money OUTPUT,
@customerItems int OUTPUT
AS
SELECT @customerTotal = SUM(UnitPrice * Quantity * (1 - Discount))
FROM [Order Details] INNER JOIN Orders
ON [Order Details].OrderID = Orders.OrderID
WHERE Orders.CustomerID = @customerID
SELECT @customerItems = SUM(Quantity)
FROM [Order Details] INNER JOIN Orders
ON [Order Details].OrderID = Orders.OrderID
WHERE Orders.CustomerID = @customerID
DECLARE @customerOrders int
SELECT @customerOrders = COUNT(*) FROM Orders
WHERE Orders.CustomerID = @customerID
RETURN @customerOrders


quando la eseguo :
DECLARE @Total money
DECLARE @Items int
DECLARE @Orders int
DECLARE @custID varchar(5)
DECLARE @CustomerTotal decimal
DECLARE @CustomerItems int
SET @custID = ‘BLAUS’
EXEC @orders = CustomerTotals @custID,
@customerTotal OUTPUT, @customerItems OUTPUT
PRINT ‘Customer ‘ + @custId + ‘ has placed a total of ‘ +
CAST(@orders AS varchar(8)) + ‘ orders ‘ +
‘ totaling $’ + CAST(ROUND(@customerTotal, 2) AS varchar(12)) +
‘ and ‘ + CAST(@customerItems AS varchar(4)) + ‘ items.’

mi dice:
Invalid object name 'Order Details'.
lo stesso messaggio sia in visual studio che in sql2008 express

ma!?!?

Gho5t Profilo | Junior Member

Ciao,
allora il testo del messaggio è chiaro, Sql Server, quando prova ad eseguire la Stored Procedure non riesce a trovare la tabella "Order Details".
Hai selezionato il Database giusto oppure stai tentando di fare una stored procedure sul database di default (che è "master")?
USE NomeDatabase; GO
Esiste una tabella con il nome "Order Details" (compreso lo spazio)?
Se un uomo non è disposto a correre qualche rischio per le sue idee, o le sue idee non valgono nulla o non vale nulla lui

jjchuck Profilo | Senior Member

vabbè rinco ma cosi tanto no è!
cmq... Msg 208, Level 16, State 1, Procedure CustomerTotals, Line 6
Invalid object name 'Order Details'....rimane

la tabella cè: dbo.Order Details

proprio non capisco

ps. tks

alx_81 Profilo | Guru

>vabbè rinco ma cosi tanto no è!
l'errore è strano, non credo che la risposta ti considerasse rinco.. vengono solo soluzioni "semplici"

>proprio non capisco
facciamo così, lancia questa query sul tuo db e posta il result:
SELECT TABLE_SCHEMA, TABLE_NAME, REPLACE(TABLE_NAME, ' ', 'x') as VediamoSeCiSonoPiuSpazi
FROM INFORMATION_SCHEMA.TABLES

postaci il result sulla tabella Order Details..
vediamo se ci sono caratteri che non si vedono.

In generale, non dare nomi con spazi o caratteri speciali. Non è mai buona norma.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

direi che si:
dbo OrderxDetails

...pero si usano le [] per ovviare al problema (almeno per quanto ne so)

percui se è questo il problema che fo??

grazie in anticipo (di questi tempi nessuno ti da niente in anticipo...)



ps: non me la sono presa per la risposta...ci mancherebbe ....scherzavo
come avrai capito sono un burlone...

alx_81 Profilo | Guru

>...pero si usano le [] per ovviare al problema (almeno per quanto ne so)
sì è così

>percui se è questo il problema che fo??
prova ad usare il management studio e fare tasto destro sulla tabella -> select top 1000 rows, quello funziona? Come scrive la SELECT?

>ps: non me la sono presa per la risposta...ci mancherebbe ....scherzavo
>come avrai capito sono un burlone...
siamo in 2

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

SELECT TOP 1000 [OrderID]
,[ProductID]
,[UnitPrice]
,[Quantity]
,[Discount]
FROM [Northwind].[dbo].[Order Details]



et voilà

alx_81 Profilo | Guru

>SELECT TOP 1000 [OrderID]
> ,[ProductID]
> ,[UnitPrice]
> ,[Quantity]
> ,[Discount]
> FROM [Northwind].[dbo].[Order Details]
>et voilà
se questa funziona, ed immagino di sì, credo proprio possano essere solo due cose:

- metti lo schema indicato nella tua query: dbo.[Order Details], perchè quello assegnato di default alla tua utenza non è detto che sia dbo
- verifica che la connectionstring che usi per eseguire la sp sia effettivamente su Northwind

a me non viene altro

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

non capisco (pag 671-Mastering vb 2010): Customer BLAUS has placed a total of 8 orders totaling $10355.45 and 653 items.
se eseguo la sp con clik destro dando come parametri i risultati sopra viene eseguita ma se provo il codice non ne vengo fuori

cmq dato che lo scopo è lo studio vi ringrazio per avermi risposto ed ora che ho attirato la vostra attenzione posso sfruttarvi per
un problema di lavoro :

è na cavolata per voi ma io non ne esco:
su alcuni orrori da me creati in ms access vorrei che l'utente non debba editare Uid e psw per l'autenticazione sql

non ci riesco
vi allego un esempio di come faccio su un mdb con allegata una tabella in locale del solito Northwind....
il codice funziona ma all'apertura l'utente deve digitare Id e pawrd

ora ...voglio dimenticare gli orrori del passato e migrare verso nuovi orrori in vs2010/sql2008....ma non posso rifarli tutti (il dolore è troppo forte)


Per far funzionare mdb (lo sapete ma....) dovete solo sostituire le credenziali e collegare la stessa tabella che ora è importata (altrimenti funziona per forza)

Help!!!

alx_81 Profilo | Guru

>se eseguo la sp con clik destro dando come parametri i risultati
>sopra viene eseguita ma se provo il codice non ne vengo fuori
non riesco nemmeno a vedere il codice, prova a postarlo, ma quello che hai passato è access (che si connette poi a sql) e come mai usi odbc? mah..
sinceramente cambierei connectionstring, ma non è quello il problema. Non ti so proprio aiutare di più.

>è na cavolata per voi ma io non ne esco:
>su alcuni orrori da me creati in ms access vorrei che l'utente
>non debba editare Uid e psw per l'autenticazione sql
eh l'utente usato per aprire l'access deve avere i privilegi per andare su sql server.
Ma perchè usi access per andare su sql? Non puoi scriverti il software tu?


--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

per quanto rigurda l'oggetto del post:
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Dim CN As New SqlConnection("Data Source=.;Initial Catalog=Northwind;Integrated Security=True")
Dim customerID As String = InputBox("Please enter a customer ID",
"CustomerTotals Stored Procedure", "ALFKI")
If customerID.Trim.Length = 0 Then Exit Sub
Dim CMD As New SqlCommand
CMD.Connection = CN
CMD.CommandText = "CustomerTotals"
CMD.CommandType = CommandType.StoredProcedure
CMD.Parameters.Add(
"@customerID", SqlDbType.VarChar, 5).Value = customerID
CMD.Parameters.Add("@customerTotal", SqlDbType.Money)
CMD.Parameters("@customerTotal").Direction = ParameterDirection.Output
CMD.Parameters.Add("@customerItems", SqlDbType.Int)
CMD.Parameters("@customerItems").Direction = ParameterDirection.Output
CMD.Parameters.Add("@orders", SqlDbType.Int)
CMD.Parameters("@orders").Direction = ParameterDirection.ReturnValue
CN.Open()
CMD.ExecuteNonQuery() '********Invalid object name 'Order Details'.
CN.Close()
Dim items As Integer
items = Convert.ToInt32(CMD.Parameters("@customerItems").Value)
Dim orders As Integer
orders = Convert.ToInt32(CMD.Parameters("@orders").Value)
Dim ordersTotal As Decimal
ordersTotal = Convert.ToDouble(
CMD.Parameters("@customerTotal").Value)
TextBox1.Text = "Customer BLAUS has placed " &
orders.ToString & " orders " &
"totaling $" & Math.Round(ordersTotal, 2).ToString("#,###.00") &
" and " & items.ToString & " items"
End Sub

per quanto riguarda l'access: quando sono entrato in azienda non sapevo accendere il pc e per fare reportistica ad uso inteno (chiamata pomposamente Business Intelligence) usavo excel come base dati, poi ho avuto una brutta exp con Qlikview, poi finalmente ho imparato access ed ora finalmente lavoro con sql2008 e vs2010...
si il codice posso scriverlo ma non capisco cosa intenti: le credenziali per l'accesso ce le ho ovviamente e se le scrivo in ambiente vb tutto funziona ma comunque non riesco a skippare la maschera di autenticazione sql....
hai provato a eseguire l'access sul tuo pc?
abbi pazienza spero di essermi spiegato....
se risolvo sta cosa me tolgo na rottura da niente!!!!

alx_81 Profilo | Guru

considera che servirebbe la traccia della chiamata effettiva.
Riesci a tracciare l'effettiva chiamata verso sql? il vero comando..
hai provato ad esplicitare lo schema dbo prima di [Order Details]?


>si il codice posso scriverlo ma non capisco cosa intenti: le
>credenziali per l'accesso ce le ho ovviamente e se le scrivo
>in ambiente vb tutto funziona ma comunque non riesco a skippare
>la maschera di autenticazione sql....
>hai provato a eseguire l'access sul tuo pc?
non posso, non ho il sql legato.



--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

ho imparato solo ieri le opzioni delle view...(inside ms sql server 2008 t-sql programming )...
non capisco ti ho postato tutto l'esempio del testo (mastering vb 2010)...

non capisco che significa lo schemda dbo... (ha a che fare con lo schemabinding e la possibilità di rintracciare il comando :
EXEC sp_helptext 'dbo.NomeView'....?)

scusa è la prima cosa che mi viene in mente....

alx_81 Profilo | Guru

>non capisco che significa lo schemda dbo... (ha a che fare con
>lo schemabinding e la possibilità di rintracciare il comando
>scusa è la prima cosa che mi viene in mente....
no, nella stored procedure, sostiuisci "FROM [Order Details]" con "FROM dbo.[Order Details]" e prova a vedere se va
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

CREATE PROCEDURE CustomerTotals @customerID varchar(5), @customerTotal money OUTPUT, @customerItems int OUTPUT AS SELECT @customerTotal = SUM(UnitPrice * Quantity * (1 - Discount)) FROM [Order Details] INNER JOIN Orders ON [Order Details].OrderID = Orders.OrderID WHERE Orders.CustomerID = @customerID SELECT @customerItems = SUM(Quantity) FROM [Order Details] INNER JOIN Orders ON [Order Details].OrderID = Orders.OrderID WHERE Orders.CustomerID = @customerID DECLARE @customerOrders int SELECT @customerOrders = COUNT(*) FROM Orders WHERE Orders.CustomerID = @customerID RETURN @customerOrders
ho ricreato la sp sopra ...sostituendo dbo.[Order Details] a [Order Details] nella clausola from.... da comunque errore :( ma!!!!

alx_81 Profilo | Guru

>CREATE PROCEDURE CustomerTotals
>@customerID varchar(5),
>@customerTotal money OUTPUT,
>@customerItems int OUTPUT
>AS
>SELECT @customerTotal = SUM(UnitPrice * Quantity * (1
>- Discount))
>FROM [Order Details] INNER JOIN Orders
>ON [Order Details].OrderID = Orders.OrderID
>WHERE Orders.CustomerID = @customerID
>SELECT @customerItems = SUM(Quantity)
>FROM [Order Details] INNER JOIN Orders
>ON [Order Details].OrderID = Orders.OrderID
>WHERE Orders.CustomerID = @customerID
>DECLARE @customerOrders int
>SELECT @customerOrders = COUNT(*) FROM Orders
>WHERE Orders.CustomerID = @customerID
>RETURN @customerOrders
>ho ricreato la sp sopra ...sostituendo dbo.[Order Details] a
>[Order Details] nella clausola from.... da comunque errore :(
>ma!!!!
?? a me non sembra che tu l'abbia cambiata..
al posto di [Order Details] metti dbo.[Order Details], ovunque compare.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

CREATE PROCEDURE CustomerTotals @customerID varchar(5), @customerTotal money OUTPUT, @customerItems int OUTPUT AS SELECT @customerTotal = SUM(UnitPrice * Quantity * (1 - Discount)) FROM dbo.[Order Details] INNER JOIN Orders ON dbo.[Order Details].OrderID = Orders.OrderID WHERE Orders.CustomerID = @customerID SELECT @customerItems = SUM(Quantity) FROM dbo.[Order Details] INNER JOIN Orders ON dbo.[Order Details].OrderID = Orders.OrderID WHERE Orders.CustomerID = @customerID DECLARE @customerOrders int SELECT @customerOrders = COUNT(*) FROM Orders WHERE Orders.CustomerID = @customerID RETURN @customerOrders

ho Dropato la sp e l'ho ricreata come sopra...ma niente da fare...
l'errore in visual studio è sempre lo stesso CMD.ExecuteNonQuery() ' Invalid object name 'dbo.Order Details'.

...ma non è che ho installato male sql2008 ??? non ce sto capi na mazza co sterrore

alx_81 Profilo | Guru

>...ma non è che ho installato male sql2008 ???
eheh no non c'entra nulla..

ascolta, ma se esegui direttamente quella sp da una query window di SQL Server Management Studio, gira?

--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

gira ma mi chiede i parametri (come è giusto) e se inserisco solo 'BLAUSE' (come da esempio) mi restituisce valori NULL
cioè: per ottenere il risultato che voglio debbo inserire i valori del risultato :) ....è fantastico ....è un bagno di sangue:) :)

cmq passando ad altro...(tanto solo cosi ti frego):)
...sto cercando di indizzare una view rispettando tutti i requirements ma ovviamente:

errore...non gli piace perchè cè un join diverso dal INNERR....


IF OBJECT_ID('dbo.VIEW', 'V') IS NOT NULL DROP VIEW dbo.VIEW; GO CREATE VIEW dbo.VIEW WITH SCHEMABINDING AS SELECT dbo.TABELLA.cAMPO1, dbo.TABELLA.cAMPO2 ... CASE WHEN dbo.TABELLA2.CAMPO1 <> '' THEN dbo.TABELLA2.CAMPO1 ELSE '' END AS destdiv, COUNT_BIG(*) AS conta, row_number() OVER(ORDER BY CAMPO1) as rn FROM dbo.TABELLA LEFT OUTER JOIN dbo.TABELLA2 ON dbo.TABELLA.cAMPO1 = dbo.TABELLA2.cAMPO1 AND ... GROUP BY dbo.TABELLA.cAMPO1, dbo.TABELLA.cAMPO2 ... CASE WHEN dbo.TABELLA2.CAMPO1 <> '' THEN dbo.TABELLA2.CAMPO1 ELSE '' END GO CREATE UNIQUE CLUSTERED INDEX idx_campo ON dbo.VIEW(cAMPO1);

come vedi voglio solo aggiungere un campo in una tabella e probabilmente si deve seguire una strada piu logica (tipo ALTER TABLE) ma io sono
perverso e voglio sbandare su sta strada :)
perchè non gli piace ???
ne azzeccassi una

alx_81 Profilo | Guru

>gira ma mi chiede i parametri (come è giusto) e se inserisco
>solo 'BLAUSE' (come da esempio) mi restituisce valori NULL
>cioè: per ottenere il risultato che voglio debbo inserire i valori
>del risultato :) ....è fantastico ....è un bagno di sangue:):)
vedi che eseguendolo direttamente va? Quindi il problema potrebbe essere access.
Io però, anche dal tuo access non capisco come fai a chiamare quella stored e da dove la chiami.
Il problema sta lì..

>cmq passando ad altro...(tanto solo cosi ti frego):)
>...sto cercando di indizzare una view rispettando tutti i requirements
>ma ovviamente
per questo ti chiedo di aprire un nuovo thread, anche per essere di aiuto ad altri.
grazie.
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

ok apro uno nuovo
ma cmq ce un misandent....un qui pro.....NON CE SEMO CAPITI

non la chiamo da acces...la chiamo da Visual Studio Ultimate...

access vorrei lasciarmelo alle spalle...anzi lo sto già facendo ma il primo amore....


cmq si girare gira ma non mi pare normale che uno script nato per gestire parametri non lo faccia...o no?

alx_81 Profilo | Guru

SI DICE MISANTERTENSIGNNGGS!!!

>cmq si girare gira ma non mi pare normale che uno script nato
>per gestire parametri non lo faccia...o no?
direi che l'unica è che mi passi allora il codice che scrivi per connetterti. Tutto, compresa la chiamata..
grazie
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi

jjchuck Profilo | Senior Member

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

...cmq l'avevo già postato...
se non è questo fammi sape che faccio prima a passarti tutta la soluzione o l'ip del pc...o vengo a casa tua...

alx_81 Profilo | Guru

>se non è questo fammi sape che faccio prima a passarti tutta
>la soluzione o l'ip del pc...o vengo a casa tua...
l'unica è aprire una sessione team viewer .. perchè è veramente strano.
Io direi che puoi provare a creare un'altra tabella con un nome simile tipo "cippa lippa", l'importante è che ci sia uno spazio.
Poi fai una sp che la richiama e vedi se ti dà lo stesso problema. Mi viene da dire che il blocco sta nello spazio..
Anche se deve andare!
--
Alessandro Alpi | SQL Server MVP
MCP|MCITP|MCTS|MCT

http://www.alessandroalpi.net
http://blogs.dotnethell.it/suxstellino
http://mvp.support.microsoft.com/profile/Alessandro.Alpi
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5