2011-08-07 13 views
17

Pochodzę z mySQL na SQL Server. Czy następująca składnia nie działa w SQL Server?Składnia INSERT INTO SET w SQL Server

INSERT INTO table SET fil1="234", fil2="324" 

Czy istnieje porównywalne oświadczenie w SQL Server?

+5

Co za myląca składnia! Gdybym nie wiedział, jak korzystać z wyszukiwania w Internecie do [dokumentacji] (http://dev.mysql.com/doc/refman/5.5/en/insert.html), pomyślałbym, że ktoś pomieszał UPDATE i WSTAW! –

+0

Oba ansvers są przydatne dzięki! –

+13

Rzeczywiście nienawidzę obecnej składni SQL. Wydaje się, że dobrze działa z małymi tabelami, ale gdy tabela zaczyna mieć wiele kolumn, o wiele przyjemniej jest użyć składni Col = value. – Rhyous

Odpowiedz

8

SET sposobem wstawiania rekordów nie jest standard SQL. Jeśli jest to potrzebne, aby używać podobnych sql dla aktualizacji i wkładek, należy użyć magazynowanych procedur opisanych w MS SQL Server zamiast, na przykład:

CREATE Procedure tableInsertUpdate 
(
    @ID int, 
    @fil1 int, 
    @fil2 int, 
    @IDOut int OUTPUT 
) 
AS 
    IF EXISTS(SELECT ID from table WHERE [email protected]) 
    BEGIN 
     UPDATE table SET 
      fil1 = @fil1 
      fil2 = @fil2 
     WHERE [email protected] 
     SET @IDOut=null 
     END 
     ELSE 
     BEGIN 
     INSERT INTO table 
     (fil1, fil2) 
     VALUES 
     (@fil1, @fil2) 
     SET @IDOut=scope_identity() 
     END 
+1

To nie jest bezpieczne dla wątków. Możesz to naprawić, sprawiając, że istnieje możliwość seryjnego sprawdzania lub ponawiając duplikat błędu klucza. Preferowana jest ostatnia opcja, ponieważ uczynienie jej serializacją spowoduje prędzej czy później powstanie zakleszczenia. –

+0

Możesz również spojrzeć na statystyki MERGE w Books Online. – HLGEM

16
INSERT INTO table (fil1, fil2) VALUES ('234', '324');
+3

Wstaw ma tylko tę składnię? (tak biedny) –

+4

Niekoniecznie coś złego. Ponieważ nie jest to standard SQL. –

+0

@KakYlia, to od 6 do jeden, pół tuzina do drugiego. Oba wymagają jawnego podania swoich pól, jeśli nie wprowadzasz INSERTing danych dla wszystkich pól. –

8

To tylko wielki kłopot posiadającym INSERT i UPDATE. Łatwo zrozumiesz, jeśli będziesz musiał pracować z tabelami zawierającymi 30 kolumn.

Wariant MySQL pozwala mi pisać kod jeden raz - i robi oba potrzebne rzeczy - w rzeczywistości wystarczy zastąpić nazwę polecenia w ciągu znaków zapytania.

Wariant MSSQL wywołuje błędy, mając prawie taki sam kod (pod względem nazw pól i danych, aby wypełnić pola) 2 razy.

A jeśli później zmienię tylko jedną nazwę pola, oznacza to zmianę 2 pozycji kodu - tak czy inaczej zrobię to w MSSQL. Procedura składowana musi zostać zmieniona, a instrukcja insert wywołuje ją w moim kodzie. Lub w razie potrzeby 2 różne instrukcje wstawiania i aktualizacji wymagają zmiany. To oczywiste źródło błędów jest całkowicie obwiniane (przynajmniej z mojego punktu widzenia) na MSSQL.

Powiązane problemy