299 sql sql-server
我有一个SQL Server数据库,我想知道它有哪些列和类型.我更喜欢通过查询而不是使用像企业管理器这样的GUI来实现这一点.有没有办法做到这一点?
Vin*_*nie 323
您可以使用sp_columns存储过程:
exec sp_columns MyTable
Run Code Online (Sandbox Code Playgroud)
Bra*_*non 111
有几种方法可以获取有关表的元数据:
EXEC sp_help tablename
Run Code Online (Sandbox Code Playgroud)
将返回几个结果集,描述表,它的列和约束.
该INFORMATION_SCHEMA意见会给你你想要的信息,但不幸的是你要查询的意见,并手动将其加入.
Sal*_*007 49
如果你不想使用存储过程,这里是一个简单的查询版本
select *
from information_schema.columns
where table_name = 'aspnet_Membership'
order by ordinal_position
Run Code Online (Sandbox Code Playgroud)
suk*_*khi 29
使用此查询
Select * From INFORMATION_SCHEMA.COLUMNS Where TABLE_NAME = 'TABLENAME'
Run Code Online (Sandbox Code Playgroud)
kin*_*005 15
除了其他答案中显示的方式之外,您还可以使用
SELECT TOP 0 * FROM table_name
Run Code Online (Sandbox Code Playgroud)
这将为您提供每列的名称,但不会产生任何结果,并且几乎可以立即完成,且开销最小.
Abh*_*eet 14
请使用以下sql查询; 这适用于我的情况.
select * FROM INFORMATION_SCHEMA.Columns where table_name = 'tablename';
Run Code Online (Sandbox Code Playgroud)
我在t-sql中编写了一个sql*plus DESC(RIBE),如select(也显示列注释):
USE YourDB
GO
DECLARE @objectName NVARCHAR(128) = 'YourTable';
SELECT
a.[NAME]
,a.[TYPE]
,a.[CHARSET]
,a.[COLLATION]
,a.[NULLABLE]
,a.[DEFAULT]
,b.[COMMENTS]
-- ,a.[ORDINAL_POSITION]
FROM
(
SELECT
COLUMN_NAME AS [NAME]
,CASE DATA_TYPE
WHEN 'char' THEN DATA_TYPE + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
WHEN 'numeric' THEN DATA_TYPE + '(' + CAST(NUMERIC_PRECISION AS VARCHAR) + ', ' + CAST(NUMERIC_SCALE AS VARCHAR) + ')'
WHEN 'nvarchar' THEN DATA_TYPE + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
WHEN 'varbinary' THEN DATA_TYPE + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
WHEN 'varchar' THEN DATA_TYPE + '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + ')'
ELSE DATA_TYPE
END AS [TYPE]
,CHARACTER_SET_NAME AS [CHARSET]
,COLLATION_NAME AS [COLLATION]
,IS_NULLABLE AS [NULLABLE]
,COLUMN_DEFAULT AS [DEFAULT]
,ORDINAL_POSITION
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = @objectName
) a
FULL JOIN
(
SELECT
CAST(value AS NVARCHAR) AS [COMMENTS]
,CAST(objname AS NVARCHAR) AS [NAME]
FROM
::fn_listextendedproperty ('MS_Description', 'user', 'dbo', 'table', @objectName, 'column', default)
) b
ON a.NAME COLLATE YourCollation = b.NAME COLLATE YourCollation
ORDER BY
a.[ORDINAL_POSITION];
Run Code Online (Sandbox Code Playgroud)
上面提到的select可以在系统标记的存储过程中使用,它可以通过简单的方式从您的实例的任何数据库中调用:
USE master;
GO
IF OBJECT_ID('sp_desc', 'P') IS NOT NULL
DROP PROCEDURE sp_desc
GO
CREATE PROCEDURE sp_desc (
@tableName nvarchar(128)
) AS
BEGIN
DECLARE @dbName sysname;
DECLARE @schemaName sysname;
DECLARE @objectName sysname;
DECLARE @objectID int;
DECLARE @tmpTableName varchar(100);
DECLARE @sqlCmd nvarchar(4000);
SELECT @dbName = PARSENAME(@tableName, 3);
IF @dbName IS NULL SELECT @dbName = DB_NAME();
SELECT @schemaName = PARSENAME(@tableName, 2);
IF @schemaName IS NULL SELECT @schemaName = SCHEMA_NAME();
SELECT @objectName = PARSENAME(@tableName, 1);
IF @objectName IS NULL
BEGIN
PRINT 'Object is missing from your function call!';
RETURN;
END;
SELECT @objectID = OBJECT_ID(@dbName + '.' + @schemaName + '.' + @objectName);
IF @objectID IS NULL
BEGIN
PRINT 'Object [' + @dbName + '].[' + @schemaName + '].[' + @objectName + '] does not exist!';
RETURN;
END;
SELECT @tmpTableName = '#tmp_DESC_' + CAST(@@SPID AS VARCHAR) + REPLACE(REPLACE(REPLACE(REPLACE(CAST(CONVERT(CHAR, GETDATE(), 121) AS VARCHAR), '-', ''), ' ', ''), ':', ''), '.', '');
--PRINT @tmpTableName;
SET @sqlCmd = '
USE ' + @dbName + '
CREATE TABLE ' + @tmpTableName + ' (
[NAME] nvarchar(128) NOT NULL
,[TYPE] varchar(50)
,[CHARSET] varchar(50)
,[COLLATION] varchar(50)
,[NULLABLE] varchar(3)
,[DEFAULT] nvarchar(4000)
,[COMMENTS] nvarchar(3750));
INSERT INTO ' + @tmpTableName + '
SELECT
a.[NAME]
,a.[TYPE]
,a.[CHARSET]
,a.[COLLATION]
,a.[NULLABLE]
,a.[DEFAULT]
,b.[COMMENTS]
FROM
(
SELECT
COLUMN_NAME AS [NAME]
,CASE DATA_TYPE
WHEN ''char'' THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
WHEN ''numeric'' THEN DATA_TYPE + ''('' + CAST(NUMERIC_PRECISION AS VARCHAR) + '', '' + CAST(NUMERIC_SCALE AS VARCHAR) + '')''
WHEN ''nvarchar'' THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
WHEN ''varbinary'' THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
WHEN ''varchar'' THEN DATA_TYPE + ''('' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR) + '')''
ELSE DATA_TYPE
END AS [TYPE]
,CHARACTER_SET_NAME AS [CHARSET]
,COLLATION_NAME AS [COLLATION]
,IS_NULLABLE AS [NULLABLE]
,COLUMN_DEFAULT AS [DEFAULT]
,ORDINAL_POSITION
FROM
INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = ''' + @objectName + '''
) a
FULL JOIN
(
SELECT
CAST(value AS NVARCHAR) AS [COMMENTS]
,CAST(objname AS NVARCHAR) AS [NAME]
FROM
::fn_listextendedproperty (''MS_Description'', ''user'', ''' + @schemaName + ''', ''table'', ''' + @objectName + ''', ''column'', default)
) b
ON a.NAME COLLATE Hungarian_CI_AS = b.NAME COLLATE Hungarian_CI_AS
ORDER BY
a.[ORDINAL_POSITION];
SELECT * FROM ' + @tmpTableName + ';'
--PRINT @sqlCmd;
EXEC sp_executesql @sqlCmd;
RETURN;
END;
GO
EXEC sys.sp_MS_marksystemobject sp_desc
GO
Run Code Online (Sandbox Code Playgroud)
要执行过程类型:
EXEC sp_desc 'YourDB.YourSchema.YourTable';
Run Code Online (Sandbox Code Playgroud)
如果要获取描述当前数据库(和模式)的对象简单类型:
EXEC sp_desc 'YourTable';
Run Code Online (Sandbox Code Playgroud)
由于sp_desc是一个系统标记的过程,你甚至可以保留exec命令(不推荐):
sp_desc 'YourTable';
Run Code Online (Sandbox Code Playgroud)
相当于 Oracle 的describe命令的 SQL Server是存储过程sp_help
该describe命令为您提供有关列名称、类型、长度等的信息。
在 SQL Server 中,假设您想在数据库 'mydb' 中的架构 'myschema' 中描述一个表 'mytable',您可以执行以下操作:
USE mydb;
exec sp_help 'myschema.mytable';
Run Code Online (Sandbox Code Playgroud)
尝试一下:
EXEC [ServerName].[DatabaseName].dbo.sp_columns 'TableName'
Run Code Online (Sandbox Code Playgroud)
并且可以获得一些表结构信息,例如:
TABLE_QUALIFIER、TABLE_OWNER、TABLE_NAME、COLUMN_NAME、DATA_TYPE、TYPE_NAME...
除了上述问题之外,如果我们在数据库中有类似的表db_name.dbo.table_name,我们可以使用以下步骤
与数据库连接
USE db_name;
使用EXEC sp_help并且不要忘记输入表名称,就'dbo.tablename'好像您有dboas 架构一样。
exec sp_help 'dbo.table_name'
这应该有效!
| 归档时间: |
|
| 查看次数: |
500452 次 |
| 最近记录: |