質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

3756閲覧

sqlserverでカラムが自動採番やキーかどうかをSQLで知りたい

ky_46

総合スコア92

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2016/09/14 07:49

###前提・実現したいこと
SQLserverのバックアップファイルのみがあり、開発者も経緯も不明のデータベースがあります。
接続して使用だけは出来ますので、MySQLに移して、WEBアプリ化などしたいと思っています。

###発生している問題・エラーメッセージ
Googleなどで調べ、次のSQLを発行しました。

###発行したSQL

SQL

1SELECT 2 o.xtype AS TableType , 3 o.name AS TableName , 4 c.name AS ColumnName , 5 t.name AS ColumnTypeName , 6 c.length AS ColumnLength , 7 c.isnullable AS ColumnNullOK 8 FROM 9 syscolumns as c 10 INNER JOIN ( 11 SELECT 12 id , 13 xtype , 14 name 15 FROM 16 sysobjects 17 WHERE 18 xtype IN ('U','V') 19 AND 20 name = '[テーブルの名前]' 21 ) AS o 22 ON 23 c.id = o.id 24 INNER JOIN ( 25 SELECT xtype,xusertype,type,usertype,name 26 FROM systypes 27 ) AS t 28 ON 29 c.xtype = t.xtype 30 AND 31 c.xusertype = t.xusertype 32 ORDER BY 33 o.name , 34 c.colid 35;

###足りない情報
MySQLで言うところの、auto_increment が設定されているかどうか。 primary key指定がされているかどうかが知りたいです。

Googleで調べた限りでは、SQLServerではIDENTITYの指定がauto_increment にあたるようですが、このIDENTITYの指定がカラムに対して行われているか。またKey指定になっているかをSQLで取り出す方法がありましたら、教えてください。

###補足情報
VB.NETからADO経由でSQLSERVERに接続し、上記のSQLを送り、カラム名やタイプはデータセットとして受け取る事に成功しています。
後は、自動採番が採用されているかや、どのテーブルがキーなのかをSQLで拾い出せれば、それを元にCREATE TABLEをMysqlに対して発行するようにして、データベース構造とデータを丸ごと移植する事を考えております。
なにぶん、資料などが全く無く、データベース本体のみという有様ですので、一つ一つカラムを見ながら移すのでは膨大な時間がかかってしまいますので、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下は私がテーブル構造を知りたい時にべろっと投げるSQLです。
(SQLServer 2005, 2014 では動いてます)

use <DBName> とかして、以下をそのままコピペすれば動くと思います。

sql

1WITH TBLS AS ( 2 SELECT 3 tbl.object_id AS TableId 4 , tbl.name AS TableName 5 , tbl.tv 6 , col.column_id AS ColumnId 7 , col.name AS ColumnName 8 9 -- データ型/長さ 10 , SUBSTRING( 11 dtp.name 12 + CASE WHEN dtp.name IN ('datetime', 'int', 'bit', 'decimal', 'bigint', 'tinyint', 'money', 'text', 'ntext') THEN '' 13 ELSE '(' + 14 CASE WHEN dtp.name IN ('varchar', 'nvarchar', 'varbinary') 15 AND col.max_length = -1 THEN 'max' 16 WHEN dtp.name IN ('nchar', 'nvarchar') THEN 17 CONVERT(varchar, (col.max_length / 2)) 18 ELSE CONVERT(varchar, col.max_length) END 19 + ')' 20 END 21 , 1, 20) AS ColumnDataType 22 23 -- PKEY 24 , CASE WHEN 25 (SELECT TOP 1 1 FROM information_schema.key_column_usage x 26 WHERE x.table_name = tbl.name AND x.column_name = col.name) 27 = 1 THEN '○' ELSE '' END AS PKey 28 29 -- NULL許可 30 , CASE WHEN col.is_nullable = 1 THEN '' ELSE '○' END AS NotNull 31 32 -- IDENTITY 33 , CASE WHEN idt.object_id IS NULL THEN '' 34 ELSE 'IDENTITY(' +CONVERT(varchar,idt.seed_value)+ ', ' 35 +CONVERT(varchar,idt.increment_value)+ ')' END AS ColumnIdentity 36 -- COLLATE 37 , CASE WHEN col.collation_name IS NULL THEN '' 38 ELSE 'COLLATE ' +col.collation_name END AS Collation 39 -- コメント 40 , ep.value AS ColumnComment 41 , tep.value AS TableComment 42 43--FROM sys.tables tbl 44 FROM ( 45 SELECT 'T' AS [tv], object_id, name FROM sys.tables UNION ALL 46 SELECT 'V' AS [tv], object_id, name FROM sys.views 47 ) tbl 48 49 LEFT JOIN sys.columns col ON (col.object_id = tbl.object_id) 50 LEFT JOIN sys.types dtp ON (dtp.system_type_id = col.system_type_id AND dtp.user_type_id = col.user_type_id) 51 LEFT JOIN sys.identity_columns idt ON (idt.object_id = col.object_id AND idt.column_id = col.column_id) 52 LEFT JOIN sys.extended_properties ep ON (ep.major_id = col.object_id AND ep.minor_id = col.column_id AND ep.name = 'MS_Description') 53 LEFT JOIN sys.extended_properties tep ON (tep.major_id = tbl.object_id AND tep.minor_id = 0 AND tep.name = 'MS_Description') 54-- ORDER BY tbl.name, col.column_id 55) 56, DOCS AS ( 57 SELECT * FROM TBLS 58 UNION ALL 59 SELECT DISTINCT TableId, TableName, tv, -9 AS ColumnId, '', '', '', '', '', '', '', TableComment FROM TBLS --テーブル名行 60 UNION ALL 61 SELECT DISTINCT TableId, TableName, tv, -8 AS ColumnId, '項目名', 'データ型', 'PKEY', 'NOT NULL', 'IDENTITY', '照合順序', 'コメント', TableComment FROM TBLS --見出し行 62 UNION ALL 63 SELECT DISTINCT TableId, TableName, tv, 9999 AS ColumnId, '', '', '', '', '', '', '', '' FROM TBLS --空行用 64) 65SELECT 66 CASE WHEN ColumnId = -9 THEN TableName ELSE '' END [テーブル名] 67, CASE WHEN ColumnId = -9 THEN tv ELSE '' END [tv] 68, ColumnName AS [項目名] 69, ColumnDataType AS [データ型] 70, PKey AS [PKEY] 71, NotNull AS [NOT NULL] 72, ColumnIdentity AS [IDENTITY] 73, Collation AS [照合順序] 74, CASE WHEN ColumnId BETWEEN 1 AND 9998 THEN 75 CASE WHEN ColumnIdentity <> '' THEN ColumnIdentity + '; ' ELSE '' END 76 + CONVERT(varchar, ISNULL(ColumnComment, '')) 77 ELSE ColumnComment END AS [コメント] 78FROM DOCS 79WHERE TableName LIKE '%%' -- ★★★テーブル名 80ORDER BY TableName, ColumnId

私も結構前に色々ぐぐって見つけたSQLを切り貼りして作ったものなので
もしどこか間違えていたらごめんなさい…

これは私が見やすいように色々整形していますが、
必要な情報的には最初の WITH 句 <TBLS> の SELECT だけで事足りる筈です。

投稿2016/09/14 08:27

編集2016/09/14 09:04
sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sk_3122

2016/09/14 09:07 編集

【追記1】 「データ型/長さ」のあたりは 私が触っているシステムで使ってる型しか網羅していないので 必要に応じて修正が必要かもしれません 【追記2】 私のSQLの中に 『9999 AS ColumnId』 という記述があるのですが、 テーブルのカラムが 9999 以上あると表示がおかしくなります。 (これはテーブル同士の間に空行を入れたくて用意した行です) その場合は 99999 とかにすれば多分大丈夫です。
sk_3122

2016/09/14 09:01

私のSQL は sys.tables しか見ていなかったので、sys.views も見るよう修正してみました。 合ってそう、に見えます… どうかな…
ky_46

2016/09/14 14:13

ありがとうございます。 PKEYの○がKeyカラム、IDENTITY(1,1)があるのが自動採番ですね。 このリザルトをもとに、MySQLへのCREATE TABLE文を作成するプログラムを作成してみます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問