2011-07-06 7 views
3

プライマリキーまたは代替キーではないテーブルからすべての列名を取得するクエリを作成する方法の指摘がありますか。具体的には、クエリから代替キーを除外したいと思います。プライマリキーと代替キー以外のテーブル内のすべての列を一覧表示するSQL Serverクエリ

+1

次のようになります。問題は、COALESCEはので、私はそれを取り除くためにキリルのソリューションを修正EXCEPTでは動作しないということでした〜から〜 –

答えて

4
DECLARE @tableName nvarchar(max) = 'table_name' 

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = @tableName 

EXCEPT 

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS [tc] 
JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE [ku] ON tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME 
    AND ku.table_name = @tableName 
+1

完璧!忘れてしまったことを除いて! – Lrn

+1

:AND tc.CONSTRAINT_TYPE = 'PRIMARY KEY' – Misi

1

データベースシステムは、列(または列の集合)が代替キーであるかどうかを判断できません(代替キーという用語は、プライマリであった列キー - すべてのPK要件(ユニークでNOT NULL)を満たしていますが、何らかの理由でプライマリキーに選択されていませんでした。this article for referenceを参照してください)。

プライマリキー(または代替キー)が何を構成しているかを知るには、多くの「意味」ノウハウがあります。プライマリキーはプライマリキー制約に含まれて「タグ付け」されていますが、代替キーにはそのようなものはありません - プライマリキーになるようにしなかったため、テーブル内の通常の列になりますはプライマリキーである必要がありますが、そうではありません。

私はSQL Serverがあなたのためにそれらを把握することができるだろうか見ない

...

1

私はsimmilar問題のためのキーのリストを取得しなければならなかったが、私はまた、COALESCEを使用していました。

SELECT COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
JOIN sysobjects ON TABLE_NAME = name 
WHERE TABLE_NAME = @tablename 
AND COLUMN_NAME NOT IN (
    SELECT name 
    FROM syscolumns 
    WHERE [id] IN (SELECT [id] 
     FROM sysobjects 
     WHERE [name] = @tablename) 
     AND colid IN (SELECT SIK.colid 
     FROM sysindexkeys SIK 
     JOIN sysobjects SO ON SIK.[id] = SO.[id] 
     WHERE SIK.indid = 1 
      AND SO.[name] = @tablename)) 

はたぶんあなたが選択するSYS.TABLESまたはINFORMATION_SCHEMAを持っている誰かのためのヘルプ:)

+0

この回答は、プライマリ列を除くすべての列を取得するのに便利です。 – Pirinthan

関連する問題