gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 08:57:12 25 4
gpt4 key购买 nike

是否可以在不知道列的实际数据类型的情况下将列从“允许空值”更改为“不允许空值”?

我认为没有,所以我为我的存储过程制作了基本的骨架代码:

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');

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

最佳答案

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

无论哪种方式,您还应该检查是否指定了字符长度和/或数字精度,并确保您在正确的架构中更改表(而不是获取 dbo.TableName 而不是 customschema.TableName)。您可以尝试这样的操作(我在这里使用了 INFORMATION_SCHEMA,但您可以轻松地重构它以使用 sys.columns View ):

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

@retVal 现在将捕获数据类型,例如 intvarchar(100)varbinary(MAX)、或 decimal(10,2) 正确。

然后像这样构建一个动态 SQL 查询:

DECLARE @sql VARCHAR(MAX);
SET @sql = 'ALTER TABLE ' + @schemaName + '.' + @tableName + ' ALTER COLUMN ' + @columnName + ' ' + @retVal + ' NOT NULL;'
EXEC(@sql);

关于sql-server - 在不知道数据类型的情况下更改列(null -> not null),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35459583/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com