如果表中的列具有相同的数据类型且存在数字
,我想更改表原始tTable结构
表名
ColumnName NVARCHAR(100)
如果ColumnName
NVARCHAR
且长度为100,则更改列的代码
IF EXISTS(...)
BEGIN
ALTER TABLE [dbo].[TableName]
ALTER COLUMN [ColumnName] NVARCHAR(200) [NULL|NOT NULL]
END
我需要在IF EXISTS(...)
插入哪些查询?
答案 0 :(得分:3)
我个人总是选择SQL Server系统视图而不是INFORMATION_SCHEMA,原因为detailed by Aaron Bertrand。另外一个好处是,在这种情况下,您可以排除计算列,这些列只显示为表INFORMATION_SCHEMA.COLUMNS
中的普通列。
IF EXISTS
( SELECT 1
FROM sys.columns c
INNER JOIN sys.types t
ON t.system_type_id = c.system_type_id
AND t.user_type_id = c.user_type_id
WHERE c.name = 'ColumnName'
AND c.[object_id] = OBJECT_ID(N'dbo.TableName', 'U')
AND t.name = 'nvarchar'
AND c.max_length = 100
AND c.is_computed = 0
)
BEGIN
ALTER TABLE [dbo].[TableName]
ALTER COLUMN [ColumnName] NVARCHAR(200) [NULL|NOT NULL]
END;
如this SQL Fiddle所示,在使用信息架构方法时,您可能会尝试更改计算列并收到错误。
答案 1 :(得分:1)
IF EXISTS(SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TableName' AND TABLE_SCHEMA='dbo'
AND COLUMN_NAME = 'ColumnName' AND DATA_TYPE = 'nvarchar'
AND CHARACTER_MAXIMUM_LENGTH = 100)
BEGIN
ALTER TABLE [dbo].[TableName]
ALTER COLUMN [ColumnName] NVARCHAR(200) [NULL|NOT NULL]
END
答案 2 :(得分:0)
SELECT column_name 'Column Name',
data_type 'Data Type',
CHARacter_maximum_length 'Maximum Length'
FROM information_schema.columns
WHERE table_name = 'TableName'
从这个你获取列名并以游标的形式输入,考虑每一行和进程休息
答案 3 :(得分:0)
试试这个
IF EXISTS (SELECT data_type FROM Information_Schema.Columns WHERE Table_Name = 'MyTable'
AND Column_Name = 'MyColumn' AND data_type = 'NVARCHAR ' AND character_maximum_length =100)
BEGIN
ALTER TABLE [dbo].[TableName]
ALTER COLUMN [ColumnName] NVARCHAR(200) [NULL|NOT NULL]
END
答案 4 :(得分:0)
我,我懒得输入所有那些系统表连接(更不用说INFORMATION_YADA模式),我只是使用元数据函数:
IF columnproperty(object_id('dbo.TableName'), 'ColumnName', 'ColumnId') is not null
and columnproperty(object_id('dbo.TableName'), 'ColumnName', 'Precision') = 200
ALTER...
我相信这适用于SQL 2005,但您需要检查。
答案 5 :(得分:-1)
出于某种原因,如果您尝试重命名不存在的列,PostgreSQL 将发出错误。不幸的是,PostgreSQL 没有为 IF EXISTS
子句提供 RENAME
选项。