WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Konvertera MSSQL query till MYSQL (https://www.wn.se/forum/showthread.php?t=1065785)

naak2803 2015-10-27 11:15

Konvertera MSSQL query till MYSQL
 
Hej,
skulle behöva lite hjälp med att konvertera om en SQL query från MSSQL till MYSQL.

Kod:

IF NOT EXISTS (SELECT * FROM IF_sessions WHERE session_name = '" + sSession_name + "' AND session_id = '"+ sSession_id + "')
BEGIN
INSERT INTO IF_sessions(session_id, created, expires, session_name, session_data)
Values('" + sSession_id + "', GETDATE(), '" + System.DateTime.Now.AddHours(2) + "', '" + sSession_name + "', '" + sSession_data + "')
END
ELSE
BEGIN
UPDATE IF_sessions SET expires = GETDATE(), session_data = '" + sSession_data + "' WHERE session_id = '" + sSession_id + "' AND session_name = '"+ sSession_name + "'
END


Nerix 2015-10-27 11:16

Börja med att posta din SQL-kod och inte din .NET-kod.

SvanteH 2015-10-27 11:52

Citat:

Ursprungligen postat av Nerix (Inlägg 20513742)
Börja med att posta din SQL-kod och inte din .NET-kod.

Det är väl inget fel på den SQL koden?

qson 2015-10-27 20:57

Det är inblandat variabler som inte är SQL (sSession_name m.fl.) och så ligger ett anrop till System.DateTime.Now.AddHours(2) som också är .NET så detta är en del av (troligen) c#-kod som genererar SQL. KAn vi få se den genererade sql-koden (det som faktiskt skickas till databasen) så är det lättare att hjälpa till när man slipper "gissa".

qson 2015-10-27 21:12

Jag tror inte du kan använda IF-satser i Mysql om du inte har dem i en funktion. Då får du istället bryta ut koden till separata sql-frågor och göra if-satserna i din applikation istället för i databasen:

Jag skall försöka ge mig på en tolkning av din mix av .NET-kod och SQL till en pseudo-variant. "ExecuteSql" nedan är bara en placeholder för vad du nu har för att exekvera sql-kod.

Kod:

var count = ExecuteSql("SELECT COUNT(*) FROM IF_sessions WHERE session_name = '" + sSession_name + "' AND session_id = '"+ sSession_id + "'");

if (count == 0) {
    ExecuteSql("INSERT INTO IF_sessions(session_id, created, expires, session_name, session_data)
Values('" + sSession_id + "', NOW(), '" + System.DateTime.Now.AddHours(2) + "', '" + sSession_name + "', '" + sSession_data + "') "
}
else {
    ExecuteSql("UPDATE IF_sessions SET expires = NOW(), session_data = '" + sSession_data + "' WHERE session_id = '" + sSession_id + "' AND session_name = '"+ sSession_name + "'")
}


naak2803 2015-10-28 09:36

Citat:

Ursprungligen postat av qson (Inlägg 20513762)
Jag tror inte du kan använda IF-satser i Mysql om du inte har dem i en funktion. Då får du istället bryta ut koden till separata sql-frågor och göra if-satserna i din applikation istället för i databasen:

Jag skall försöka ge mig på en tolkning av din mix av .NET-kod och SQL till en pseudo-variant. "ExecuteSql" nedan är bara en placeholder för vad du nu har för att exekvera sql-kod.

Kod:

var count = ExecuteSql("SELECT COUNT(*) FROM IF_sessions WHERE session_name = '" + sSession_name + "' AND session_id = '"+ sSession_id + "'");

if (count == 0) {
    ExecuteSql("INSERT INTO IF_sessions(session_id, created, expires, session_name, session_data)
Values('" + sSession_id + "', NOW(), '" + System.DateTime.Now.AddHours(2) + "', '" + sSession_name + "', '" + sSession_data + "') "
}
else {
    ExecuteSql("UPDATE IF_sessions SET expires = NOW(), session_data = '" + sSession_data + "' WHERE session_id = '" + sSession_id + "' AND session_name = '"+ sSession_name + "'")
}


jo, detta funkar! MEN det blir två st queries till database, försöker göra det med endast en.

jayzee 2015-10-28 12:03

Citat:

Ursprungligen postat av naak2803 (Inlägg 20513774)
jo, detta funkar! MEN det blir två st queries till database, försöker göra det med endast en.

Det betyder inte att det blir snabbare för det. Skall du hålla på och extremoptimera (behövs antagligen inte alls) kan du börja med att skriva om det till Stored Procedure.

Conny Westh 2015-10-28 16:44

Jag skulle också rekommendera att skriva om det till en SP som du skickar in värdena till, det blir bättre struktur och snabbare exekvering jämfört med denna dynamiska SQL-sats.

Använd ADO.NET och parameteriserad ADO/SQL så du omöjliggör SQL-Injections när du ändå fixar till koden.

https://msdn.microsoft.com/en-us/lib...v=vs.110).aspx

Kod:

// C#
OleDbCommand command = new OleDbCommand("SampleProc", connection);
command.CommandType = CommandType.StoredProcedure;

OleDbParameter parameter = command.Parameters.Add(  "RETURN_VALUE", OleDbType.Integer);
parameter.Direction = ParameterDirection.ReturnValue;

parameter = command.Parameters.Add(  "@InputParm", OleDbType.VarChar, 12);
parameter.Value = "Sample Value";

parameter = command.Parameters.Add(  "@OutputParm", OleDbType.VarChar, 28);
parameter.Direction = ParameterDirection.Output;


För att skapa en Stored Procedure i MS SQL-Server se här: https://msdn.microsoft.com/en-us/library/ms345415.aspx


Kod:

-- Skapa en SP
USE AdventureWorks2012;
GO
CREATE PROCEDURE HumanResources.uspGetEmployeesTest2
    @LastName nvarchar(50),
    @FirstName nvarchar(50)
AS

    SET NOCOUNT ON;
    SELECT FirstName, LastName, Department
    FROM HumanResources.vEmployeeDepartmentHistory
    WHERE FirstName = @FirstName AND LastName = @LastName
    AND EndDate IS NULL;
GO


Kod:

-- Anropa en SP för att testa
EXECUTE HumanResources.uspGetEmployeesTest2 N'Ackerman', N'Pilar';
-- Or
EXEC HumanResources.uspGetEmployeesTest2 @LastName = N'Ackerman', @FirstName = N'Pilar';
GO
-- Or
EXECUTE HumanResources.uspGetEmployeesTest2 @FirstName = N'Pilar', @LastName = N'Ackerman';
GO


qson 2015-10-28 20:33

Citat:

Ursprungligen postat av naak2803 (Inlägg 20513774)
jo, detta funkar! MEN det blir två st queries till database, försöker göra det med endast en.

Jo, det stämmer, men i din ursprungliga fråga kommer den ändå göra två sökningar i databasen. I ena fallet skickar du ett kommando om att göra två och i andra fallet skickar du två kommandon för två sökningar.

Ett sätt att optimera är som jayzee skriver att göra en Stored Procedure. En annan variant är att göra primary key till "SESSION_ID + SESSION_NAME" och sen använda INSERT INTO ... ON DUPLICATE KEY UPDATE

http://dev.mysql.com/doc/refman/5.1/...duplicate.html

Kod:

INSERT INTO IF_sessions(session_id, created, expires, session_name, session_data)
Values('...', ..., '...', '...', '....')
ON DUPLICATE KEY UPDATE
expires = '...',
session_data = '...'


terbon 2016-01-12 12:08

Ett annat rätt vanligt tillvägagångssätt är att köra en UPDATE och sen kolla om det var några rader som uppdaterades (affected rows, @@rowcount eller liknande). Då behöver du bara köra en query ifall posten redan fanns, i annat fall blir det två. Men det är oundvikligt.


Alla tider är GMT +2. Klockan är nu 02:18.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson