12. december 2005 - 20:03
Der er
36 kommentarer og 2 løsninger
Prepared statements vs Stored procedures vs statements
Er der nogen der ved hvor jeg kan finde en sammenligning mellem disse 3 kald. Eller nogen der kan tilknytte et par kommentare til dem.
Annonceindlæg fra Novataris
12. december 2005 - 20:17
#2
stored procedures er "programming i SQL på database serveren" det kan give nogle pæne performance forbedringer det kan også bruges til at forbedre security stored procedures er traditionelt ikke så populære i Java kredse, fordi de ikke er portable mellem forskellige database
12. december 2005 - 20:17
#3
Nu var det bare generelt.. men jeg falder kun over det i java hvorfor egentlig det.. hvorfor ikke i php, asp el. lign. Og synes ikke jeg finde så meget om med hensyn til hastigheder og således.. men tjekker lige din artikel....
12. december 2005 - 20:22
#4
(jeg har nogle eksempler på Java & SP)
12. december 2005 - 20:23
#5
Statement findes vel i alle database API'er PreparedStatement eksisterer i de fleste database API'er i JDBC (og PHP 5.x MySQL API) hedder det PreparedStatement i ADO og ADO.NET hedder det Parameters
12. december 2005 - 20:23
#6
hvad mener du med: Statement ikke genbrugt statement genbrugt PreparedStatement ikke genbrugt PreparedStatement genbrugt
12. december 2005 - 20:23
#7
Statements er så at sige rå SQL-udtryk, ét statement kan kun indeholde ét samlet SQL-udtryk. Prepared statements er har til formål at optimere gentagelser af det samme statement, men med forskellige data, f.eks. 4000 inserts kan med fordel afvikles som prepared statement. De fungerer sådan, at udtrykket forberedes/behandles på database-serveren, hvor værdier angives med spørgsmålstegn. Data indsættes fra applikationen for hvert spørgsmålstegn, hvorefter det samlede SQL-udtryk eksekveres. Herefter kan applikationen indsætte nye data og eksekvere SQL-udtrykket uden at skulle sende selve SQL-udtrykket med, men kan nøjes med værdierne. Stored procedures gør det muligt at afvikle mange statements i én samlet operation direkte i database-serveren. Samtidig er det muligt at bruge T-SQL, der gør programmelle udtryk mulige, såsom if/else, for/while mv.
12. december 2005 - 20:25
#8
Så når vi har med mssql at gøre det hedder parameters... måske derfor jeg ikke kunne finde noget på det...
12. december 2005 - 20:28
#9
kig på koden det er spørgsmålet om hvorvidt man opretter et nyt Statement eller PreparedStatement objekt for hvert SQL kald
12. december 2005 - 20:35
#10
nej termen er database API afhængigt ikke database afhængigt du kan godt bruge JDBC PreparedStatement mod SQLServer og ADO.NET Parameters mod Oracle
12. december 2005 - 20:41
#11
ved du hvordan du definere prepared statements i asp så... Og hvor meget mere giver stored procedures contra prepared statements...
12. december 2005 - 20:47
#12
Måske sådan her: set Conn = Server.CreateObject("ADODB.Connection") Conn.Open = "Driver={SQL Server}; Server=localhost; Database=test; uid=xxx; pwd=xxx;timeout=500;Connection_timeout=500;" Conn.Execute("PREPARE test FROM "SELECT name FROM tabel WHERE ID = ?") Eller sådan her: Conn.Execute("PARAMETERS test FROM "SELECT name FROM tabel WHERE ID = ?")
12. december 2005 - 20:47
#13
Det er jeg lidt i tvivl om...
12. december 2005 - 20:50
#14
<% ' open adParamInput = 1 adInteger = 3 adVarChar = 200 Set con = Server.CreateObject("ADODB.Connection") con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Databases\MSAccess\Test.mdb;;" Set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = con ' traditionel con.Execute "INSERT INTO t1 VALUES(7,'O''Toole')" ' med parameters cmd.CommandText = "INSERT INTO t1 VALUES(@f1,@f2)" cmd.Parameters.Append(cmd.CreateParameter("@f1", adInteger, adParamInput)) cmd.Parameters.Append(cmd.CreateParameter("@f2", adVarChar, adParamInput, 50)) cmd.Parameters("@f1") = 8 cmd.Parameters("@f2") = "O'Malley" cmd.Execute ' close Set cmd = Nothing Set con = Nothing %> OK
12. december 2005 - 21:00
#15
eksemplet er mod Access, men det er helt det samme med SQLServer
12. december 2005 - 21:10
#16
stored procedures vil i nogle tilfælde - formentligt mest i forbindelse med SQL sætninger som kun skal udføres en gang per connetcion og som ikke er specielt tunge give noget fordi den gemmer execution plan - i andre tilfælde vil der ikke være den store forskel
19. december 2005 - 02:12
#17
smid et svar begge to
19. december 2005 - 09:08
#18
Svar.
19. december 2005 - 10:10
#19
ok
01. januar 2006 - 23:03
#20
Hej Arne_v, er det den eneste måde, som du skrev den 12/12 kl. 20.50.06, men kan lave en prepared statement i asp
01. januar 2006 - 23:04
#21
Og den her linie: cmd.Parameters.Append(cmd.CreateParameter("@f2", adVarChar, adParamInput, 50)) adParamInput er det mindste input og de 50 er max input eller hvad...
01. januar 2006 - 23:09
#22
tror jeg ---- adParamInput betyder at det er en input parameter (stored procedures kan også havde output parameter) 50 er max længde altså en VARCHAR(50)
01. januar 2006 - 23:13
#23
Du mener prepared statements ik.... hvorfor definere du adVarChar til 200, når du definere den til 50 senere ;-)
01. januar 2006 - 23:16
#24
nej parameters deles af prepared statements og stored procedures det er altid adParamInput for prepared statements, men stored procedures kan bruge adParamOutput
01. januar 2006 - 23:17
#25
adVarChar = 200 er kode nummeret for VARCHAR - det har ikke noget med længde at gøre
01. januar 2006 - 23:19
#26
Men i Stored procedures kan man jo bare nøjes med at kalde den således her: SQL = "INSERT_STATEMENT 'test'" Conn.Execute(SQL)
01. januar 2006 - 23:20
#27
eller bruger du man også cmd.parameters der
01. januar 2006 - 23:24
#28
det er ret almindeligt at bruge parameters til stored procedures og hvis man vil have en output parameter så er det absolut nødvendigt
01. januar 2006 - 23:26
#29
jeg har faktisk et eksempel dog i JScript og ikke i VBScript men ADO er det samme <%@ Language="JScript" %> <% var adCmdStoredProc = 4; var adParamOutput = 2; var adParamReturnValue = 4; var adInteger = 3; var con = Server.CreateObject("ADODB.Connection"); con.open("Provider=SQLOLEDB; Server=ARNEPC2;Database=Test;User ID=sa;Password=;"); var cmd = Server.CreateObject("ADODB.Command"); cmd.ActiveConnection = con; cmd.CommandType = adCmdStoredProc; cmd.CommandText = "TEST_OUTRET"; cmd.Parameters.Append(cmd.CreateParameter("@retval", adInteger, adParamReturnValue)); cmd.Parameters.Append(cmd.CreateParameter("@outarg", adInteger, adParamOutput)); cmd.Execute; Response.Write(cmd.Parameters("@outarg").Value + " " + cmd.Parameters("@retval").Value); con.Close; %>
01. januar 2006 - 23:28
#30
Den her kan nu godt returnere et recordsæt uden at man angiver output parameter.. SQL = "SQL_STATEMENT 'test'" Conn.Execute(SQL) Hvor SQL_STATEMENT er en SELECT-sætning....
01. januar 2006 - 23:30
#31
ja men det er noget andet en stored procedure kan returnere værdier på 3 måder: result set (som bliver til ADO record set) output parameters (adParamOutput) return værdier (adParamReturnValue)
01. januar 2006 - 23:30
#32
her er et eksempel på en som gør alle 3 ting: CREATE PROCEDURE TEST_OUTRSRET @outarg INTEGER OUTPUT AS SELECT @outarg = 123 SELECT * FROM T1 RETURN 456 GO
01. januar 2006 - 23:31
#33
SELECT @outarg = 123 -- brug output parameter SELECT * FROM T1 -- bruge result/record set RETURN 456 -- brug retur værdi
01. januar 2006 - 23:34
#34
Ahh... Nice...... Du er squ god til alt det her.. takker..... ;-)
02. januar 2006 - 12:14
#35
Hej arne_v Når jeg kører den her: adParamInput = 1 adInteger = 3 adVarChar = 200 Conn.Open ConnectionStr Set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = Conn cmd.Prepared=true cmd.CommandText = "INSERT INTO tbl VALUES(@f1,@f2)" cmd.Parameters.Append cmd.CreateParameter("@f1", adInteger, adParamInput) cmd.Parameters.Append cmd.CreateParameter("@f2", adVarChar, adParamInput, 50) cmd.Parameters("@f1") = 1 cmd.Parameters("@f2") = "test" cmd.Execute Får jeg denne fejl: Microsoft][ODBC SQL Server Driver][SQL Server]Must declare the variable '@f1'.
02. januar 2006 - 12:20
#36
hvordan ser din connetion string ud ?
02. januar 2006 - 12:20
#37
Har fixet den med den her: adParamInput = 1 adInteger = 3 adVarChar = 200 Conn.Open ConnectionStr Set cmd = Server.CreateObject("ADODB.Command") cmd.ActiveConnection = Conn cmd.Prepared=true cmd.CommandText = "INSERT INTO tbl VALUES(?,?)" cmd.Parameters.Append cmd.CreateParameter("One", adInteger, adParamInput) cmd.Parameters.Append cmd.CreateParameter("Two", adVarChar, adParamInput, 50) cmd.Parameters("One") = 1 cmd.Parameters("Two") = "test" cmd.Execute
02. januar 2006 - 12:50
#38
hvis du brugte en OLE DB connection string fremfor en ODBC connection string så tror jeg at den med @ virkede, men ODBC er lidt anderledes
Computerworld tilbyder specialiserede kurser i database-management