在不知道数据类型的情况下更改列(null - >非null)

时间:2016-02-17 14:33:58

标签: sql-server

是否有可能改变#34的列;允许null" to"不允许null"不知道列的实际数据类型?

我认为不,所以我已经将我的存储过程作为基本的框架代码:

SELECT t.name,c.max_length FROM sys.types t 
LEFT JOIN sys.columns c ON(t.system_type_id = c.system_type_id) 
WHERE object_id=OBJECT_ID(@TableName) AND c.name=@FieldName;

EXEC('UPDATE ' + @TableName + ' SET ' + @FieldName + ' = ' + @DefaultValue + ' WHERE ' + @FieldName + ' IS NULL');
EXEC('ALTER TABLE ' + @TableName + ' ALTER COLUMN ' + @FieldName + ' NOT NULL');

我想我现在只需将第一个查询的返回值返回到第二个查询。我无法理解如何将值转换为变量然后再次访问它们。想法?

2 个答案:

答案 0 :(得分:3)

您可以将值选择为如下变量:

SELECT @Var1=t.name,@Var2=c.max_length FROM sys.types t 
LEFT JOIN sys.columns c ON(t.system_type_id = c.system_type_id) 
WHERE object_id=OBJECT_ID(@TableName) AND c.name=@FieldName;

这当然假设你已经宣布了Var1& Var2,并且您的查询只返回一行。

答案 1 :(得分:2)

由于INFORMATION_SCHEMA具有所有必需信息并且是SQL标准的一部分,因此在这种情况下使用它可能更好(但是,SQL Server的ALTER TABLE ALTER COLUMN无论如何都是非标准的,因此可能无关紧要)。

无论哪种方式,您还应该检查是否指定了字符长度和/或数字精度,并确保您正在使用正确的架构更改表(而不是dbo.TableName而不是{{ 1}})。您可以尝试这样的事情(我在这里使用customschema.TableName,但您可以轻松地重构此内容以使用INFORMATION_SCHEMA视图):

sys.columns

DECLARE @retVal VARCHAR(500); SELECT @retVal = CASE WHEN CHARACTER_MAXIMUM_LENGTH > 0 THEN CONCAT(DATA_TYPE, '(', CHARACTER_MAXIMUM_LENGTH ,')') WHEN CHARACTER_MAXIMUM_LENGTH = -1 AND DATA_TYPE <> 'xml' THEN CONCAT(DATA_TYPE, '(MAX)') WHEN DATA_TYPE IN ('numeric', 'decimal') THEN CONCAT(DATA_TYPE, '(', NUMERIC_PRECISION,',', NUMERIC_SCALE,')') ELSE DATA_TYPE END FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = @schemaName AND TABLE_NAME = @tableName AND COLUMN_NAME = @columnName 现在可以正确捕获@retValintvarchar(100)varbinary(MAX)等数据类型。

然后构建一个动态SQL查询,如下所示:

decimal(10,2)