动态传入“表名,字段名,字段类型,默认值”四个字符串,根据新的字段名称和类型来创表表结构
/*
原创:fcuandy
修改:bing110
功能:动态传入“表名,字段名,字段类型,默认值”四个字符串,根据新的字段名称和类型来创表表结构
不足:由于修改的表时候保留原来字段的数据,所以现在暂时还不能修改字段类型,创建的表中也不能创建索引,外键约束等功能
日期:2008-9-9
*/
CREATE FUNCTION dbo.Split --自定义的拆分函数,用来装传入的字符串分隔成表
(
@ItemList VARCHAR(4000),
@delimiter VARCHAR(10)
)
RETURNS @IDTable TABLE (IndexID INT IDENTITY(1,1),Item VARCHAR(50))
AS
BEGIN
WHILE CHARINDEX(@delimiter, @ItemList)>0
BEGIN
INSERT @IDTable SELECT LEFT(@ItemList,CHARINDEX(@delimiter,@ItemList)-1)
SET @ItemList=STUFF(@ItemList,1,CHARINDEX(@delimiter,@ItemList),'')
END
INSERT @IDTable SELECT @ItemList
RETURN
END
CREATE PROC P_Alter_Table
@tb VARCHAR(100), --表名
@fieldsLists VARCHAR(1000), --字段列表
@fieldsTypeLists VARCHAR(1000), --字段类型列表,需要与字段列表一一对应
@DefaultValue VARCHAR(1000) --新增字段默认值,与字段一一对应
AS
BEGIN
DECLARE @sql VARCHAR(8000)
DECLARE @sql1 VARCHAR(8000),@sql2 VARCHAR(8000),@Sql0 VARCHAR(8000)
IF object_id(@tb,'u') IS NULL --若表不存在
BEGIN
SELECT @sql=ISNULL(@sql + ',','') + '[' + a.Item + '] ' + b.Item +' Default '+CHAR(39)+ c.Item +CHAR(39)
FROM dbo.Split(@fieldsLists,',') a
INNER JOIN
dbo.Split(@fieldsTypeLists,',') b
ON a.IndexID=b.IndexID
INNER JOIN dbo.Split(@DefaultValue,',') C
ON a.IndexId=C.IndexId
EXEC('CREATE TABLE [' + @tb + '](' + @sql + ')')
END
ELSE --若表存在
BEGIN
SELECT @sql1='',@sql2='',@sql0=''
SELECT @sql1=@sql1 + CASE WHEN Field IS NULL THEN '['+name+'],' ELSE '' END,--记录待删除列列表
@Sql0=@Sql0 + CASE WHEN Field IS NULL AND CDEFAULT <> 0 THEN (SELECT [NAME] FROM SYSOBJECTS WHERE ID=CDEFAULT) + ',' ELSE '' END, --记录待删除的默认值
@sql2=@sql2 + CASE WHEN Name IS NULL THEN '['+Field+'] ' + FType + ' Default '+CHAR(39)+ DValue + CHAR(39)+',' ELSE '' END --记录待新增列列表
FROM
(SELECT [NAME],CDEFAULT FROM syscolumns WHERE id=object_id(@tb,'u')) a
FULL OUTER JOIN
(
SELECT b.Item Field,a.Item FType,c.Item DValue FROM
dbo.Split(@fieldsLists,',') b
INNER JOIN dbo.Split(@fieldsTypeLists,',') a
ON a.IndexID=b.IndexID
INNER JOIN dbo.Split(@DefaultValue,',') c
ON a.IndexId=c.IndexId
) b
ON name=Field
SELECT @sql1=STUFF(@sql1,LEN(@sql1),1,''),@sql2=STUFF(@sql2,LEN(@sql2),1,''),@sql0=STUFF(@sql0,LEN(@sql0),1,'')
IF LEN(@sql2)>0
EXEC('ALTER TABLE [' + @tb + '] ADD ' + @sql2) --先加原表中不存在的列
IF LEN(@Sql0)>0
EXEC('ALTER TABLE ['+ @TB+ '] DROP CONSTRAINT '+ @Sql0) --删除表中不需要字段的默认值
IF LEN(@sql1)>0
EXEC('ALTER TABLE [' + @tb + '] DROP COLUMN ' + @sql1) --再删除新传入结构中不需要的列
END
END
Eg:
EXEC P_ALTER_TABLE 'A','A1,A2','INT,VARCHAR(10)','0,T'
SELECT * FROM A