Java 递归更改所有表的列数据类型而不影响约束
如何有效地将模式中的所有varchar列转换为nvarchar,而不删除约束 我正在使用这个程序Java 递归更改所有表的列数据类型而不影响约束,java,sql-server,internationalization,nvarchar,Java,Sql Server,Internationalization,Nvarchar,如何有效地将模式中的所有varchar列转换为nvarchar,而不删除约束 我正在使用这个程序 CREATE PROCEDURE VarCharToNvarChar AS BEGIN DECLARE curChangeTypes CURSOR FOR SELECT column_name, table_name, character_maximum_length FROM INFORMATION_SCHEMA.COLUMNS
CREATE PROCEDURE VarCharToNvarChar
AS
BEGIN
DECLARE curChangeTypes CURSOR FOR
SELECT column_name,
table_name,
character_maximum_length
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE='VARCHAR'
AND table_name IN (SELECT DISTINCT table_Name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE DATA_TYPE='VARCHAR');
OPEN curChangeTypes;
DECLARE @cn VARCHAR(50),
@tn VARCHAR(50),
@cml INT;
DECLARE @str VARCHAR(8000);
FETCH NEXT FROM curChangeTypes INTO @cn,@tn,@cml;
WHILE(@@FETCH_STATUS = 0)
BEGIN
IF(@cml = -1)
SET @str = 'ALTER TABLE ' + @tn + ' ALTER COLUMN ' + @cn + ' NVARCHAR(MAX)';
ELSE
SET @str = 'ALTER TABLE ' + @tn + ' ALTER COLUMN ' + @cn +
' NVARCHAR('+CAST(@cml AS VARCHAR)+')';
EXEC(@str);
FETCH NEXT FROM curChangeTypes INTO @cn,@tn,@cml;
END
CLOSE curChangeTypes;
DEALLOCATE curChangeTypes;
END
由于字段上的限制,它失败
如果我们放弃约束,程序将成功执行
但约束必须完好无损
建议实现alter查询[varchar->nvarchar]而不删除约束的最佳方法您可能还具有CHECK、PRIMARY KEY、UNIQUE和外键约束,并且您可能在varchar列上具有索引。您不能简单地更改列的数据类型而不影响这些对象。如果您认为这非常简单,请尝试使用SSMS更改列类型where are constraint,然后单击脚本按钮查看需要执行的底层操作数。由于MSSQL添加了一个默认约束,该约束还指定了null或空字符串,因此,每列至少有一个约束,即默认值