是否有可能改变#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');
我想我现在只需将第一个查询的返回值返回到第二个查询。我无法理解如何将值转换为变量然后再次访问它们。想法?
答案 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
现在可以正确捕获@retVal
,int
,varchar(100)
或varbinary(MAX)
等数据类型。
然后构建一个动态SQL查询,如下所示:
decimal(10,2)