Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归更改所有表的列数据类型而不影响约束_Java_Sql Server_Internationalization_Nvarchar - Fatal编程技术网

Java 递归更改所有表的列数据类型而不影响约束

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

如何有效地将模式中的所有varchar列转换为nvarchar,而不删除约束

我正在使用这个程序

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或空字符串,因此,每列至少有一个约束,即默认值