Chciałbym określić klucz podstawowy tabeli przy użyciu TSQL (procedura przechowywana lub tabela systemowa jest w porządku). Czy istnieje taki mechanizm w SQL Server (2005 lub 2008)?Określ klucz podstawowy tabeli za pomocą TSQL
Odpowiedz
To powinno Ci zacząć:
SELECT *
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ccu ON tc.CONSTRAINT_NAME = ccu.Constraint_name
WHERE tc.CONSTRAINT_TYPE = 'Primary Key'
Jak o
sp_pkeys 'TableName'
EXEC sp_Pkeys @tableName
exec [sys].[sp_primary_keys_rowset] @table_name= 'TableName'
SELECT ccu.COLUMN_NAME, ccu.CONSTRAINT_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
INNER JOIN INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE AS ccu
ON tc.CONSTRAINT_NAME = ccu.CONSTRAINT_NAME
WHERE tc.TABLE_CATALOG = 'Your_Catalog' -- replace with your catalog
AND tc.TABLE_SCHEMA = 'dbo' -- replace with your schema
AND tc.TABLE_NAME = 'Your_Table' -- replace with your table name
AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY'
To jest _way_ lepsze niż akceptowana odpowiedź, ponieważ zawiera nazwę tabeli . –
Jest również o wiele lepszy, ponieważ ma poprawną obudowę na kolumnach i kluczu podstawowym, więc działa na serwerze z rozróżnianiem wielkich i małych liter! –
Oto jeden oparty na tabelach systemowych z SQL 2005 (99% pewien, że” d pracować w 2008 r.). Spowoduje to wyświetlenie wszystkich PK dla wszystkich tabel zdefiniowanych przez użytkownika, ze wszystkimi kolumnami i pewnym dodatkiem kłaczków, które można usunąć. Dodaj parametry, aby wybrać tabelę na raz.
SELECT
schema_name(ta.schema_id) SchemaName
,ta.name TableName
,ind.name
,indcol.key_ordinal Ord
,col.name ColumnName
,ind.type_desc
,ind.fill_factor
from sys.tables ta
inner join sys.indexes ind
on ind.object_id = ta.object_id
inner join sys.index_columns indcol
on indcol.object_id = ta.object_id
and indcol.index_id = ind.index_id
inner join sys.columns col
on col.object_id = ta.object_id
and col.column_id = indcol.column_id
where ind.is_primary_key = 1
order by
ta.name
,indcol.key_ordinal
Tak, działa również w SQL 2008. –
Najprostszy sposób to!
select object_id from sys.objects
where parent_object_id = OBJECT_ID(N'FACounty')
and [type] = N'PK'
Ten kod nie zwraca kolumn zawierających klucz podstawowy, spróbuj na złożonych kluczy podstawowych. – veljasije
Jesteś lepiej wyłączyć za pomocą INFORMATION_SCHEMA.KEY_COLUMN_USAGE jak można uzyskać dostęp do kluczowych informacji Zamawianie (ORDINAL_POSITION), który jest bardzo ważne, aby wiedzieć.
SELECT kcu.*
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
ON tc.TABLE_NAME = kcu.TABLE_NAME
AND tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME
ORDER BY tc.TABLE_NAME
,tc.CONSTRAINT_NAME
,kcu.ORDINAL_POSITION
Jeśli już znasz nazwę klucza, który Cię interesuje, następujących prac:
-- Assuming you have schema "Example" and the primary key name is "PK_Item"
-- Notice that name of table is irrelevant here but is "Foobar" here
IF (OBJECT_ID('Example.PK_ITEM') IS NULL)
BEGIN
ALTER TABLE [Example].Foobar ADD CONSTRAINT
PK_Item PRIMARY KEY ...
END
odjazdowy! Dostrzegam o wiele lepszą wydajność niż z połączenia tabeli poprzez info_schema –
Byłoby znacznie wygodniej, gdyby była to funkcja o wartości tabelarycznej, którą można wybrać z – xr280xr