我正在尝试创建一个脚本,只有当列的大小不正确时才会更改列。这样的事情。
IF NOT EXISTS (SELECT COL_LENGTH('dbo.TSC701_OCT_CONTEXT', 'sql_stmt') = 1000 )
BEGIN
ALTER TABLE dbo.TSC701_OCT_CONTEXT
ALTER COLUMN sql_stmt VARCHAR(1000)
END
抱歉搞砸了语法
答案 0 :(得分:0)
你可以这样试试。
IF (SELECT CASE WHEN COL_LENGTH('dbo.TSC701_OCT_CONTEXT', 'sql_stmt') <> 1000 THEN 1 END) = 1
BEGIN ALTER TABLE dbo.TSC701_OCT_CONTEXT alter column sql_stmt varchar(1000) END
答案 1 :(得分:0)
IF 1000 = (SELECT CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG='Database Name' AND TABLE_NAME='Table Name' AND COLUMN_NAME='Column Name')
BEGIN
ALTER TABLE [Table Name]
ALTER COLUMN [Column Name] varchar(1000) null
END
答案 2 :(得分:0)
实际上,您不需要IF子句中的SELECT语句。
IF (COL_LENGTH('dbo.TSC701_OCT_CONTEXT', 'sql_stmt') < 1000)
BEGIN
ALTER TABLE [Table Name]
ALTER COLUMN [Column Name] varchar(1000) null
END
此外,如果您的列必须为NOT NULL
或已设置为NOT NULL
,则您需要将null
从上方切换为NOT NULL
。
如果您的目标是检查数据库中的每一列,则可以使用以下代码。请注意,这可能会非常缓慢,并可能导致意外错误和问题。我会在运行它之前立即备份您计划使用的任何数据库,我也会在一个小型测试数据库或一个表上运行它,看看它是否能满足您的要求而不需要太长时间。
DECLARE @TABLE_CATALOG NVARCHAR(128), @TABLE_SCHEMA NVARCHAR(128), @TABLE_NAME NVARCHAR(128), @COLUMN_NAME NVARCHAR(128), @DATA_TYPE NVARCHAR(128)
DECLARE @IS_NULLABLE NVARCHAR(3)
DECLARE @sql NVARCHAR(1000)
WHILE EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG='teoe' AND CHARACTER_MAXIMUM_LENGTH < 1000)
BEGIN
SELECT TOP 1
@TABLE_CATALOG = TABLE_CATALOG,
@TABLE_SCHEMA = TABLE_SCHEMA,
@TABLE_NAME = TABLE_NAME,
@COLUMN_NAME = COLUMN_NAME,
@IS_NULLABLE = IS_NULLABLE,
@DATA_TYPE = DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG='teoe'
AND CHARACTER_MAXIMUM_LENGTH < 1000
SET @sql = 'ALTER TABLE [' + @TABLE_CATALOG + '].' + @TABLE_SCHEMA + '.[' + @TABLE_NAME + '] ALTER COLUMN [' + @COLUMN_NAME + '] '+ @DATA_TYPE + '(1000) ' +
CASE WHEN @IS_NULLABLE = 'YES' THEN 'NULL' ELSE 'NOT NULL' END
EXECUTE @sql
BREAK
END
答案 3 :(得分:0)
以下是我最终的结果:
IF NOT EXISTS (SELECT 1 FROM sys.columns
WHERE name = 'sql_stmt' AND object_id = object_id('CONTEXT') and max_length = 1000)
BEGIN
ALTER TABLE dbo.CONTEXT ALTER COLUMN [sql_stmt] varchar (1000) NULL
END
GO