2009-06-01 26 views
25

Czy w programie SQL Server 2000 lub nowszym jest obsługiwana kolumna klucza wygenerowanego automatycznie (klucz podstawowy) podczas używania instrukcji podobnej do następującej?Obsługa kolumn tożsamości w poleceniu "Wstaw do tabeli wartości()"?

Insert Into TableName Values(?, ?, ?) 

Moim celem jest NIE używanie w ogóle nazw kolumn.

+4

dlaczego nie chcesz skorzystać z listy nazwę kolumny? –

+0

@Mitch, jest to rodzaj skomplikowane, ale mam program, który generuje SQL w locie i w moim oryginalnym projekcie nie miałem do czynienia z kolumnami tożsamości, więc wykluczyłem nazwy kolumn. Potrzebuję szybkiej aktualizacji i mogę uniknąć używania nazw kolumn, co znacznie ułatwiłoby to. –

+0

@ nemo-- Będąc już w sytuacji "szybkiej łatki", dam ci przepustkę na razie. Ale proszę, dla własnego dobra, zaplanuj określenie nazw kolumn w następnej pełnej aktualizacji ... – RolandTumble

Odpowiedz

49

Domyślnie, jeśli masz kolumnę tożsamości, robisz nie trzeba określić go w Sekcja VALUES. Jeśli tabela jest:

ID NAME ADDRESS 

Następnie można zrobić:

INSERT INTO MyTbl VALUES ('Joe', '123 State Street, Boston, MA') 

ten zostanie automatycznie generuje identyfikator dla ciebie, a ty nie masz o tym myśleć w ogóle. Jeśli masz SET IDENTITY_INSERT MyTbl ON, możesz przypisać wartość do kolumny ID.

+1

Och, naprawdę? To jest fantastyczne. Właśnie założyłem, że to nie zadziała. Pozwól mi spróbować. –

+0

@Eric ma rację, co mam na myśli w punkcie 1 powyżej (edytowałem, aby pokazać moje zamiary), +1 –

+0

Eric to w ogóle mnie nie działa. Narzekam, że mam, tożsamość wstawić, zakładam, ponieważ próbuje wstawić pierwszy element w wartości do ID. Coś konkretnego, co musisz ustawić, aby zignorować pierwszą kolumnę? –

6

Masz 2 możliwości:

1) albo podać listę nazwa kolumny (bez kolumny tożsamości).

2) USTAW IDENTITY_INSERT SET NA ON, a następnie instrukcje wstawiania, które dostarczają jawne wartości dla kolumny tożsamości, a następnie SET IDENTITY_INSERT nazwa_tabeli OFF.

Jeśli unikanie listę nazwa kolumny, być może ta „sztuczka” może pomóc ?:

-- Get a comma separated list of a table's column names 
SELECT STUFF(
(SELECT 
',' + COLUMN_NAME AS [text()] 
FROM 
INFORMATION_SCHEMA.COLUMNS 
WHERE 
TABLE_NAME = 'TableName' 
Order By Ordinal_position 
FOR XML PATH('') 
), 1,1, '') 
+0

Aby wyjaśnić, wyraźne wartości oznaczają, że musisz wysłać zapytanie do bazy danych, aby zobaczyć kolejną tożsamość w sekwencji będzie i wstawić ręcznie? –

+0

Nie, możesz użyć dowolnej wartości, która jeszcze nie istnieje, ale następna sekwencja rozpocznie się od największej plus ... –

+0

Jest używana tylko wtedy, gdy masz coś w rodzaju danych odniesienia, które są wymagane, aby mieć dokładnie takie same wartości ID dla różnych instalacji aplikacji. –

2

Ponieważ nie jest możliwe, aby umieścić kod w komentarzu, w odpowiedzi na komentarz w odpowiedzi Erica, że ​​to nie działa dla Ciebie ...

Właśnie prowadził następujące na pole SQL 2005 (przepraszam , nr 2000 poręczny) z ustawieniami domyślnymi i to działało bez błędu:

CREATE TABLE dbo.Test_Identity_Insert 
(
    id INT IDENTITY NOT NULL, 
    my_string VARCHAR(20) NOT NULL, 
    CONSTRAINT PK_Test_Identity_Insert PRIMARY KEY CLUSTERED (id) 
) 
GO 

INSERT INTO dbo.Test_Identity_Insert VALUES ('test') 
GO 

SELECT * FROM dbo.Test_Identity_Insert 
GO 

Czy może wysłaniem wartość identyfikatora na liście wartości? Nie sądzę, że możesz zignorować kolumnę, jeśli faktycznie przekazujesz jej wartość. Na przykład, jeśli Twoja tabela ma 6 kolumn i chcesz zignorować kolumnę IDENTITY, możesz przekazać tylko 5 wartości.

+0

Twoje oświadczenie również działa dobrze dla mnie, bardzo dziwne. –

22

Inną "sztuczką" do generowania listy kolumn jest po prostu przeciągnięcie węzła "Kolumny" z Eksploratora obiektów do okna zapytania.

+3

+1 Ten bardzo mi pomógł. Tylko że to napady złości z nawiasami kwadratowymi. – Kermit

+1

Może być najlepszą wskazówką, jaką kiedykolwiek otrzymałem z SO. Niesamowite! – ryanulit

9

Najlepszą praktyką jest jawnie listy kolumn: (?),? ?,

wstawić do TableName (col1, col2, col2) Wartości

Inaczej oryginalna wkładka pęknie jeśli dodać kolejny kolumna do twojego stołu.

+0

Tak, mój szef powiedział to samo. Obaj macie całkowitą rację, ale dane w tej bazie danych są niedozwolone (tj. Wymazywane i odnawiane codziennie), więc gdyby coś takiego się wydarzyło, to nie byłby koniec świata. –

1

Rozwiązanie:

1) Set IDENTITY_INSERT ON.

2) Wstaw dane klientów do tabeli klienta.

3) Ustaw IDENTITY_INSERT na OFF.

Przeczytaj cały artykuł here.

+0

Pytanie nie dotyczy przesłonięcia kolumny tożsamości, ale sposobu unikania używania nazw pól i umożliwienia działania kolumny tożsamości w zamierzony sposób. – bummi

0
set identity_insert customer on 
insert into Customer(id,Name,city,Salary) values(8,'bcd','Amritsar',1234) 

gdzie „klient” to nazwa tabeli

Powiązane problemy