编辑:我尝试了这个代码,这是用户提到的一部分,它正确返回字段 .
SELECT * FROM INFORMATION_SCHEMA.TABLES
JOIN INFORMATION_SCHEMA.COLUMNS on
INFORMATION_SCHEMA.TABLES.TABLE_NAME =
INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
WHERE INFORMATION_SCHEMA.TABLES.TABLE_NAME = 'myTable'
前一个查询中有一些内容适用于某些数据库但不适用于其他数据库
EDIT2:
我已经尝试设置Profiler跟踪来检查通过向导创建的列,如用户建议的那样 . 显然,它使用相同的模式 .
ALTER TABLE dbo.table1 ADD
field2 nchar(10) NULL
我正在使用SQL Server 2014,并使用向导创建数据库,我的意思是,不是通过代码,而是通过使用UI .
然后,我尝试获取有关其表的列的元数据信息..并且不返回任何结果 . 我查询INFORMATION_SCHEMA .
我已经尝试对我用代码创建的数据库使用相同的查询,它工作正常,它返回列及其值等 .
我试过通过互联网查找它,但似乎无法想出任何适合这类情况的东西 . 我觉得它有点奇怪,它会对代码和UI创建的列产生影响 . 如果有人知道为什么这样的事情会发生,或者看起来很熟悉,我会很感激它的一些亮点:)
这是我用来检索列元数据的代码:
USE 'database'
SELECT infSch.TABLE_CATALOG,
infSch.TABLE_NAME,
sysCols.name,
infSch.ORDINAL_POSITION,
sysCols.is_nullable,
infSch.DATA_TYPE,
infSch.CHARACTER_MAXIMUM_LENGTH,
sysCols.is_identity,
IIF(infSchCons.CONSTRAINT_TYPE = 'PRIMARY KEY', 1, 0),
IIF(infSchCons.CONSTRAINT_TYPE = 'FOREIGN KEY', 1, 0),
IIF(infSchCons.CONSTRAINT_TYPE = 'UNIQUE', 1, 0),
IIF(infSchCons.CONSTRAINT_TYPE = 'CHECK', 1, 0)
FROM sys.columns as sysCols
RIGHT JOIN INFORMATION_SCHEMA.COLUMNS as infSch on sysCols.name =
infSch.COLUMN_NAME
RIGHT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS as infSchCons on
infSch.TABLE_NAME = infSchCons.TABLE_NAME
结果:
-
如果表和列是由代码创建的 - >它返回给定数据库的所有列及其元数据
-
如果使用UI和窗口创建表和列 - >它不返回任何内容,只返回一组空结果
1 回答
右连接改变了查询的性质,并且可以通过反转表的顺序来重写它们 . 避免正确的连接....试试这个:
该查询不会将结果限制为仅存在约束的结果 .
尝试比较这些:
最后一个查询是对原始from子句的重写,这里更容易(在我看来)看到你必须对要返回的任何行有约束 .