0

0

用表来管理SQLServer中的扩展属性(描述)

php中文网

php中文网

发布时间:2016-06-07 15:33:56

|

1138人浏览过

|

来源于php中文网

原创

数据字典是个好东东,对于开发、维护非常重要。 但Sql Server中写描述确实不方便,如何化繁为简、批量地增加修改扩展属性呢? 增加2个表和5个存储过程、2个触发器、1个表函数就好了。 把下面的SQL执行一遍生成相关的对象, 然后执行一下: 1. EXECProc_Util_

数据字典是个好东东,对于开发、维护非常重要。

但Sql Server中写描述确实不方便,如何化繁为简、批量地增加修改扩展属性呢?

增加2个表和5个存储过程、2个触发器、1个表值函数就好了。

把下面的SQL执行一遍生成相关的对象, 然后执行一下:

1. EXEC Proc_Util_Desc_GetColumnNameToDescTable , 生成表的描述对应记录

2. EXEC Proc_Util_Desc_GetTableNameToDescTable, 生成列的描述对应记录

千博企业网站管理系统免费开源版2010 Build 0418
千博企业网站管理系统免费开源版2010 Build 0418

千博企业网站管理系统主要面向大中型企业电子商务网站的构建与运营管理进行设计研发,拥有极为灵活的产品架构、极强的可扩展性与可伸缩性,可广泛适合于新闻资讯门户、企业内部知识门户、报社/杂志阅读、影音资讯、视频音频在线播放、法律顾问、政务公开、企业办公信息化等网络业务管理平台的建设,最大限度地满足客户现今乃至未来的应用需求。借助于千博企业网站管理系统极强的灵活性和便捷的可扩展性,企业级客户能够迅速流畅的

下载

3. 查看, 修改一下 dc_util_column_desc 中的某个表某个列的描述,

4. 查看: select * from [dbo].[Fun_GetTableStru]('表名')

爽吧?!


--1.1 建表(存放表的描述):dbo.dc_util_table_desc
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dc_util_table_desc]') AND type in (N'U'))
	DROP TABLE [dbo].[dc_util_table_desc]
GO
CREATE TABLE [dbo].[dc_util_table_desc](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[tableName] [varchar](100) NULL,
	[tableDesc] [nvarchar](200) NULL,
 CONSTRAINT [PK_dc_util_table_desc] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

--1.2 建表(存放列的描述):[dc_util_column_desc]
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[dc_util_column_desc]') AND type in (N'U'))
	DROP TABLE [dbo].[dc_util_column_desc]
GO
CREATE TABLE [dbo].[dc_util_column_desc](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[tableName] [varchar](100) NULL,
	[columnName] [varchar](100) NULL,
	[columnDesc] [nvarchar](200) NULL,
 CONSTRAINT [PK_dc_util_column_desc] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
 CONSTRAINT [UQ_dc_util_column_desc_tableName_columnName] UNIQUE NONCLUSTERED 
(
	[tableName] ASC,
	[columnName] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

--2.1 存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_Util_Desc_DeleteInvalidData]') AND type in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Proc_Util_Desc_DeleteInvalidData]
GO
-- =============================================
-- Author:		yenange
-- Create date: 2014-05-29
-- Description:	删除 dc_util_table_desc 表和 
--              dc_util_column_desc 表中不正确的数据
-- =============================================
CREATE PROCEDURE [dbo].[Proc_Util_Desc_DeleteInvalidData] 
AS
BEGIN
	SET NOCOUNT ON;
	--删除 dc_util_table_desc 中的无效数据
	DELETE FROM dbo.dc_util_table_desc WHERE NOT EXISTS (
		SELECT 1 FROM sys.tables T WHERE dbo.dc_util_table_desc.tableName=T.name
    ) 
    --删除 dc_util_column_desc 中的无效数据
    DELETE 
	FROM   dbo.dc_util_column_desc
	WHERE  NOT EXISTS (SELECT 1 FROM sys.tables t INNER JOIN sys.columns c ON  t.object_id = c.object_id
							WHERE  t.SCHEMA_ID IN (SELECT SCHEMA_ID FROM sys.schemas WHERE  NAME = 'dbo')
								AND dbo.dc_util_column_desc.tableName=t.name AND dbo.dc_util_column_desc.columnName=c.name	
						)
END
GO

--2.2 存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_Util_Desc_GetTableNameToDescTable]') AND type in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Proc_Util_Desc_GetTableNameToDescTable]
GO
-- =============================================
-- Author:		
-- Create date: 2014-05-29
-- Description:	将以 @tablePrefix 为前缀的表名和表对应的扩展属性 insert 到 dc_util_table_desc 表中去.
--              @tablePrefix 如果为 '' 或者 null, 则为全部表(默认为null)
--              @overrideDesc : 如果已有记录存在,是否覆盖原记录的扩展属性 (默认为1)
-- =============================================
CREATE procedure [dbo].[Proc_Util_Desc_GetTableNameToDescTable] 
	@tablePrefix VARCHAR(100) =null, 
	@overrideDesc BIT =1
AS 
BEGIN
	SET NOCOUNT ON
	--删除表中无效的数据
	exec Proc_Util_Desc_DeleteInvalidData
	
	DECLARE @t1 TABLE(rn int IDENTITY(1,1),tablename VARCHAR(100),tabledesc NVARCHAR(200))
	--插入以 @tablePrefix 为前缀的表到@t1
	INSERT INTO @t1
	(
		tablename,
		tabledesc
	)
	SELECT convert(VARCHAR(100),t.name),
		   convert (nvarchar(200),p.value)
	FROM   sys.tables                         AS t
		   LEFT JOIN sys.extended_properties  AS p
				ON  p.major_id = t.object_id
				AND p.minor_id = 0
				AND p.class = 1
				AND p.name = 'MS_Description'
	WHERE  t.SCHEMA_ID IN (SELECT SCHEMA_ID
						   FROM   sys.schemas
						   WHERE  NAME = 'dbo')
	 AND (ISNULL(@tablePrefix,'')='' or t.name LIKE +@tablePrefix+'%' )
	
	DECLARE @i INT
	DECLARE @i_max INT
	DECLARE @t_name VARCHAR(100)
	DECLARE @t_desc NVARCHAR(200)
	SET @i=1
	SELECT @i_max=COUNT(1) FROM @t1
	WHILE @i<=@i_max
		BEGIN
			SELECT @t_name=tablename,@t_desc=tabledesc FROM @t1 WHERE rn=@i
			IF @overrideDesc=1
				begin
					IF EXISTS(SELECT 1 FROM dc_util_table_desc WHERE tableName=@t_name)
						UPDATE dc_util_table_desc SET tableDesc = @t_desc WHERE tableName=@t_name
					ELSE 
						INSERT INTO dc_util_table_desc(tablename,tableDesc) VALUES (@t_name,@t_desc)
				END
			ELSE 
				BEGIN
					IF NOT EXISTS(SELECT 1 FROM dc_util_table_desc WHERE tableName=@t_name)
						INSERT INTO dc_util_table_desc(tablename,tableDesc) VALUES (@t_name,@t_desc)
				END
			set @i=@i+1
		END
END
GO
--2.3 存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_Util_Desc_GetColumnNameToDescTable]') AND type in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Proc_Util_Desc_GetColumnNameToDescTable]
GO
-- =============================================
-- Author:		
-- Create date: 2014-05-29
-- Description:	将以 @tablePrefix 为前缀的表名对应的列和列对应的扩展属性 insert 到 dc_util_column_desc 表中去.
--              @tablePrefix 如果为 '' 或者 null, 则为全部表(默认为null)
--              @overrideDesc : 如果已有记录存在,是否覆盖原记录的扩展属性 (默认为1)
-- =============================================
CREATE procedure [dbo].[Proc_Util_Desc_GetColumnNameToDescTable] 
@tablePrefix VARCHAR(100) =null, 
@overrideDesc BIT =1
AS 
BEGIN
	SET NOCOUNT ON
	--删除表中无效的数据
	exec Proc_Util_Desc_DeleteInvalidData
	
	DECLARE @t1 TABLE(rn int IDENTITY(1,1),tablename VARCHAR(100),COLUMNNAME VARCHAR(100),columndesc NVARCHAR(200))
	--插入以 @tablePrefix 为前缀的表到@t1
	INSERT INTO @t1
	(
		tablename,
		COLUMNNAME,
		columndesc
	)
	SELECT convert(varchar(100),t.name)          ,
		   convert(varchar(100),c.name)              ,
		   convert(nvarchar(200),p.value) 
	FROM   sys.tables                         AS t
		   LEFT JOIN sys.columns c
				ON  t.object_id = c.object_id
		   LEFT JOIN sys.extended_properties  AS p
				ON  p.major_id = t.object_id
				AND p.minor_id = c.column_id
				AND p.class = 1
				AND p.name = 'MS_Description'
	WHERE  t.SCHEMA_ID IN (SELECT SCHEMA_ID
						   FROM   sys.schemas
						   WHERE  NAME = 'dbo')
	 AND (ISNULL(@tablePrefix,'')='' or t.name LIKE +@tablePrefix+'%')
	
	
	DECLARE @i INT
	DECLARE @i_max INT
	DECLARE @t_name VARCHAR(100)
	DECLARE @col_name VARCHAR(100)
	DECLARE @col_desc NVARCHAR(200)
	SET @i=1
	SELECT @i_max=COUNT(1) FROM @t1
	WHILE @i<=@i_max
		BEGIN
			SELECT @t_name=tablename,@col_name=COLUMNNAME,@col_desc=columndesc FROM @t1 WHERE rn=@i
			IF @overrideDesc=1
				begin
					IF EXISTS(SELECT 1 FROM dc_util_column_desc WHERE tableName=@t_name AND columnName=@col_name)
						UPDATE dc_util_column_desc SET columnDesc = @col_desc WHERE tableName=@t_name AND columnName=@col_name
					ELSE 
						INSERT INTO dc_util_column_desc(tablename,columnName,columnDesc) VALUES (@t_name,@col_name,@col_desc)
				END
			ELSE 
				BEGIN
					IF NOT EXISTS(SELECT 1 FROM dc_util_column_desc WHERE tableName=@t_name AND columnName=@col_name )
						INSERT INTO dc_util_column_desc(tablename,columnName,columnDesc) VALUES (@t_name,@col_name,@col_desc)
				END
			set @i=@i+1
		END
END
GO
--2.4 存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_Util_Desc_SetDescToTable]') AND type in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Proc_Util_Desc_SetDescToTable]
GO
-- =============================================
-- Author:		
-- Create date: 2014-05-29
-- Description:	将 dc_util_table_desc 表中的 tableDesc 写到对应表的扩展属性
--				@tablePrefix 为表前缀 如果为 '' 或者 null, 则为全部表(默认为null)
-- =============================================
CREATE PROCEDURE [dbo].[Proc_Util_Desc_SetDescToTable] 
	@tablePrefix varchar(100) = null
AS
BEGIN
	SET NOCOUNT ON
	--删除表中无效的数据
	exec Proc_Util_Desc_DeleteInvalidData
	
	--定义表变量
	DECLARE @t1 TABLE(rn int IDENTITY(1,1),tablename VARCHAR(100),tabledesc NVARCHAR(200))
	--插入需要修改扩展属性的数据到表变量@t1
	INSERT INTO @t1
	(
		tablename,
		tabledesc
	)
	SELECT tablename,tabledesc FROM dc_util_table_desc 
	WHERE ISNULL(@tablePrefix,'')='' OR tablename LIKE +@tablePrefix+'%'
	--循环表变量中的数据
	DECLARE @i INT
	DECLARE @i_max INT
	DECLARE @t_name VARCHAR(100)
	DECLARE @t_desc NVARCHAR(200)
	SET @i=1
	SELECT @i_max=COUNT(1) FROM @t1
	WHILE @i<=@i_max
		BEGIN
			SELECT @t_name=tablename,@t_desc=tabledesc FROM @t1 WHERE rn=@i
			IF isnull(@t_desc,'')=''
			BEGIN
				SET @i=@i+1
				CONTINUE
			END
			--如果表上存在MS_Description就update,不存在就insert
			IF EXISTS (SELECT p.value
						FROM   sys.tables                         AS t
							   LEFT JOIN sys.extended_properties  AS p
									ON  p.major_id = t.object_id
						WHERE  t.SCHEMA_ID IN (SELECT SCHEMA_ID
											   FROM   sys.schemas
											   WHERE  NAME = 'dbo')
						AND		p.minor_id = 0
						AND		p.class = 1
						AND		p.name = 'MS_Description'
						AND		t.name =@t_name)
				BEGIN
					EXEC sp_updateextendedproperty 
							@name = N'MS_Description'
							,@value = @t_desc
							,@level0type = N'Schema', @level0name = 'dbo'
							,@level1type = N'Table',  @level1name = @t_name
				END
			ELSE
				BEGIN
						EXEC sp_addextendedproperty 
							@name = N'MS_Description'
							,@value = @t_desc
							,@level0type = N'Schema', @level0name = 'dbo'
							,@level1type = N'Table',  @level1name = @t_name
				END
			SET @i=@i+1
		END
END
GO
--2.5 存储过程
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Proc_Util_Desc_SetDescToColumn]') AND type in (N'P', N'PC'))
	DROP PROCEDURE [dbo].[Proc_Util_Desc_SetDescToColumn]
GO
-- =============================================
-- Author:		
-- Create date: 2014-05-29
-- Description:	将dc_util_column_desc 表中的 columnDesc 写到对应表对应列的扩展属性
--              @tablePrefix 为表前缀 如果为 '' 或者 null, 则为全部表(默认为null)
-- =============================================
CREATE PROCEDURE [dbo].[Proc_Util_Desc_SetDescToColumn] 
	@tablePrefix varchar(100) = null
AS
BEGIN
	SET NOCOUNT ON
	--删除表中无效的数据
	exec Proc_Util_Desc_DeleteInvalidData
	
	--定义表变量
	DECLARE @t1 TABLE(rn int IDENTITY(1,1),tablename VARCHAR(100),columnname VARCHAR(100),columndesc NVARCHAR(200))
	-- 插入需要修改扩展属性的数据到表变量@t1
	INSERT INTO @t1
	(
		tablename,
		columnname,
		columndesc
	)
	SELECT tablename,columnname,columndesc FROM dc_util_column_desc 
	WHERE ISNULL(@tablePrefix,'')='' or tablename LIKE +@tablePrefix+'%'

	--循环表变量中的数据
	DECLARE @i INT
	DECLARE @i_max INT
	DECLARE @t_name VARCHAR(100)
	DECLARE @col_name VARCHAR(100)
	DECLARE @col_desc NVARCHAR(200)
	SET @i=1
	SELECT @i_max=COUNT(1) FROM @t1
	WHILE @i<=@i_max
		BEGIN
			SELECT @t_name=tablename,@col_name=columnname,@col_desc=columndesc FROM @t1 WHERE rn=@i
			
			IF ISNULL(@col_desc,'')=''
			BEGIN
				SET @i=@i+1
				CONTINUE
			END
			
			--如果列上存在MS_Description就update,不存在就add
			IF EXISTS (SELECT  p.value
						FROM   sys.tables AS t
							   LEFT JOIN sys.extended_properties AS p ON  p.major_id = t.object_id
							   LEFT JOIN sys.columns c ON t.object_id=c.object_id AND c.column_id=p.minor_id
						WHERE  t.SCHEMA_ID IN (SELECT SCHEMA_ID
											   FROM   sys.schemas
											   WHERE  NAME = 'dbo')
							   AND p.class = 1
							   AND p.minor_id!=0
							   AND p.name = 'MS_Description'
							   AND t.name = @t_name
							   AND c.name = @col_name)
				BEGIN
					EXEC sp_updateextendedproperty 
							@name = N'MS_Description'
							,@value = @col_desc
							,@level0type = N'Schema', @level0name = 'dbo'
							,@level1type = N'Table',  @level1name = @t_name
							,@level2type = N'Column', @level2name = @col_name
				END
			ELSE
				BEGIN
						EXEC sp_addextendedproperty 
							@name = N'MS_Description'
							,@value = @col_desc
							,@level0type = N'Schema', @level0name = 'dbo'
							,@level1type = N'Table',  @level1name = @t_name
							,@level2type = N'Column', @level2name = @col_name
				END
			SET @i=@i+1
		END
END
GO
--3.1 触发器 
IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[Trig_dc_util_table_desc_I_U]'))
	DROP TRIGGER [dbo].[Trig_dc_util_table_desc_I_U]
GO
-- =============================================
-- Author:		
-- Create date: 2014-05-29
-- Description:	将记录更新到对应表的扩展属性
-- =============================================
CREATE TRIGGER [dbo].[Trig_dc_util_table_desc_I_U]
   ON [dbo].[dc_util_table_desc]
   AFTER INSERT , UPDATE
AS 
BEGIN
	--触发Proc_Util_SetDescToTable 更新表描述
	DECLARE @m VARCHAR(100)
	SELECT @m=tablename FROM inserted
	EXEC Proc_Util_Desc_SetDescToTable @tablePrefix=@m
END
--3.2 触发器
IF  EXISTS (SELECT * FROM sys.triggers WHERE object_id = OBJECT_ID(N'[dbo].[Trig_dc_util_column_desc_I_U]'))
	DROP TRIGGER [dbo].[Trig_dc_util_column_desc_I_U]
GO
-- =============================================
-- Author:		
-- Create date: 2014-05-29
-- Description:	将记录更新到对应列的扩展属性
-- =============================================
CREATE TRIGGER [dbo].[Trig_dc_util_column_desc_I_U]
   ON [dbo].[dc_util_column_desc]
   AFTER INSERT , UPDATE
AS 
BEGIN
	--触发Proc_Util_SetDescToColumn 去更新列描述
	DECLARE @m VARCHAR(100)
	SELECT @m=tablename FROM inserted
	EXEC Proc_Util_Desc_SetDescToColumn @tablePrefix=@m
END
--4.1 查看表的描述
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Fun_GetTableStru]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
	DROP FUNCTION [dbo].[Fun_GetTableStru]
GO
-- =============================================
-- Author:		
-- Create date: 2014-03-27
-- Description:	获取表结构
-- Demo: select * from [dbo].[Fun_GetTableStru]('表名')
-- =============================================
CREATE FUNCTION [dbo].[Fun_GetTableStru] 
(	
	@tableName NVARCHAR(MAX)
)
RETURNS TABLE 
AS
RETURN 
(
	
SELECT
	ac.column_id AS columnId
    ,AC.[name] AS columnName 
    ,TY.[name] AS dataType
    ,AC.max_length AS maxLength
    ,AC.[is_nullable] isNullable
    ,CASE WHEN AC.[name] in
		(SELECT COLUMN_NAME = convert(sysname,c.name) from sysindexes i, syscolumns c, sysobjects o where o.id = object_id(@tableName)
			and o.id = c.id
			and o.id = i.id
			and (i.status & 0x800) = 0x800
			and (
			c.name = index_col (@tableName, i.indid,  1) or
			c.name = index_col (@tableName, i.indid,  2) or
			c.name = index_col (@tableName, i.indid,  3) or
			c.name = index_col (@tableName, i.indid,  4) or
			c.name = index_col (@tableName, i.indid,  5) or
			c.name = index_col (@tableName, i.indid,  6) or
			c.name = index_col (@tableName, i.indid,  7) or
			c.name = index_col (@tableName, i.indid,  8) or
			c.name = index_col (@tableName, i.indid,  9) or
			c.name = index_col (@tableName, i.indid, 10) or
			c.name = index_col (@tableName, i.indid, 11) or
			c.name = index_col (@tableName, i.indid, 12) or
			c.name = index_col (@tableName, i.indid, 13) or
			c.name = index_col (@tableName, i.indid, 14) or
			c.name = index_col (@tableName, i.indid, 15) or
			c.name = index_col (@tableName, i.indid, 16)
			)) THEN 1 ELSE 0 END AS isPK
	,CASE WHEN AC.[name] IN (  
            SELECT t1.name  
            FROM   (  
                       SELECT col.name,  
                              f.constid       AS temp  
                       FROM   syscolumns col,  
                              sysforeignkeys     f  
                       WHERE  f.fkeyid = col.id  
                              AND f.fkey = col.colid  
                              AND f.constid IN (SELECT DISTINCT(id)  
                                                FROM   sysobjects  
                                                WHERE  OBJECT_NAME(parent_obj) =   
                                                       @tableName  
                                                       AND xtype = 'F')  
                   )  AS t1,  
                   (  
                       SELECT OBJECT_NAME(f.rkeyid)  AS rtableName,  
                              col.name,  
                              f.constid              AS temp  
                       FROM   syscolumns col,  
                              sysforeignkeys            f  
                       WHERE  f.rkeyid = col.id  
                              AND f.rkey = col.colid  
                              AND f.constid IN (SELECT DISTINCT(id)  
                                                FROM   sysobjects  
                                                WHERE  OBJECT_NAME(parent_obj) =   
                                                       @tableName  
                                                       AND xtype = 'F')  
                   )  AS t2  
            WHERE  t1.temp = t2.temp  
    ) THEN 1 ELSE 0 END AS isFK
    ,(SELECT COLUMNPROPERTY( OBJECT_ID(@tableName),ac.name,'IsIdentity')) AS isIdentity 
    ,ISNULL(t2.[DESCRIPTION], '') AS [columnDesc]
	,ISNULL((
		SELECT ISNULL(VALUE, '')
       FROM   sys.extended_properties ex_p
       WHERE  ex_p.minor_id = 0
              AND ex_p.major_id = t.OBJECT_ID
	),'') AS [tableDesc]
FROM    sys.[tables] AS T
        INNER JOIN sys.[all_columns] AC ON T.[object_id] = AC.[object_id]
        INNER JOIN sys.[types] TY ON AC.[system_type_id] = TY.[system_type_id]
                                     AND AC.[user_type_id] = TY.[user_type_id]
		LEFT JOIN (  
                    SELECT DISTINCT(sys.columns.name),  
                           (  
                               SELECT VALUE  
                               FROM   sys.extended_properties  
                               WHERE  sys.extended_properties.major_id = sys.columns.object_id  
                                      AND sys.extended_properties.minor_id = sys.columns.column_id  
                           ) AS DESCRIPTION  
                    FROM   sys.columns,  
                           sys.tables,  
                           sys.types  
                    WHERE  sys.columns.object_id = sys.tables.object_id  
                           AND sys.columns.system_type_id = sys.types.system_type_id  
                           AND sys.tables.name = @tableName  
                ) AS t2  ON AC.name=t2.name
WHERE   T.[is_ms_shipped] = 0 AND T.name=@tableName

)
GO


热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

28

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

8

2026.01.26

苹果官方查询网站 苹果手机正品激活查询入口
苹果官方查询网站 苹果手机正品激活查询入口

苹果官方查询网站主要通过 checkcoverage.apple.com/cn/zh/ 进行,可用于查询序列号(SN)对应的保修状态、激活日期及技术支持服务。此外,查找丢失设备请使用 iCloud.com/find,购买信息与物流可访问 Apple (中国大陆) 订单状态页面。

31

2026.01.26

npd人格什么意思 npd人格有什么特征
npd人格什么意思 npd人格有什么特征

NPD(Narcissistic Personality Disorder)即自恋型人格障碍,是一种心理健康问题,特点是极度夸大自我重要性、需要过度赞美与关注,同时极度缺乏共情能力,背后常掩藏着低自尊和不安全感,影响人际关系、工作和生活,通常在青少年时期开始显现,需由专业人士诊断。

3

2026.01.26

windows安全中心怎么关闭 windows安全中心怎么执行操作
windows安全中心怎么关闭 windows安全中心怎么执行操作

关闭Windows安全中心(Windows Defender)可通过系统设置暂时关闭,或使用组策略/注册表永久关闭。最简单的方法是:进入设置 > 隐私和安全性 > Windows安全中心 > 病毒和威胁防护 > 管理设置,将实时保护等选项关闭。

5

2026.01.26

2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】
2026年春运抢票攻略大全 春运抢票攻略教你三招手【技巧】

铁路12306提供起售时间查询、起售提醒、购票预填、候补购票及误购限时免费退票五项服务,并强调官方渠道唯一性与信息安全。

35

2026.01.26

个人所得税税率表2026 个人所得税率最新税率表
个人所得税税率表2026 个人所得税率最新税率表

以工资薪金所得为例,应纳税额 = 应纳税所得额 × 税率 - 速算扣除数。应纳税所得额 = 月度收入 - 5000 元 - 专项扣除 - 专项附加扣除 - 依法确定的其他扣除。假设某员工月工资 10000 元,专项扣除 1000 元,专项附加扣除 2000 元,当月应纳税所得额为 10000 - 5000 - 1000 - 2000 = 2000 元,对应税率为 3%,速算扣除数为 0,则当月应纳税额为 2000×3% = 60 元。

12

2026.01.26

oppo云服务官网登录入口 oppo云服务登录手机版
oppo云服务官网登录入口 oppo云服务登录手机版

oppo云服务https://cloud.oppo.com/可以在云端安全存储您的照片、视频、联系人、便签等重要数据。当您的手机数据意外丢失或者需要更换手机时,可以随时将这些存储在云端的数据快速恢复到手机中。

40

2026.01.26

抖币充值官方网站 抖币性价比充值链接地址
抖币充值官方网站 抖币性价比充值链接地址

网页端充值步骤:打开浏览器,输入https://www.douyin.com,登录账号;点击右上角头像,选择“钱包”;进入“充值中心”,操作和APP端一致。注意:切勿通过第三方链接、二维码充值,谨防受骗

7

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 9.4万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.9万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号