Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.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
Sql server 在SQLServer2005中使用批处理sql更改列排序规则_Sql Server_Sql Server 2005_Tsql_Collation - Fatal编程技术网

Sql server 在SQLServer2005中使用批处理sql更改列排序规则

Sql server 在SQLServer2005中使用批处理sql更改列排序规则,sql-server,sql-server-2005,tsql,collation,Sql Server,Sql Server 2005,Tsql,Collation,我接管了一个数据库。似乎在某个时候,默认数据库排序规则已更改。因此,某些列具有旧的默认排序规则,但更改排序规则后添加的新列具有新的排序规则。还有大量使用联合的存储过程代码。当代码执行时,我恰好得到 无法解决SELECT语句中第5列的排序规则冲突。 错误(例如,第一个选择返回排序规则A中的列,而第二个选择返回排序规则B中的列)。是否有一种方法可以编写一个SQL,例如选择所有列,将排序规则SQL\u Latin1\u General\u CP1\u CI\u作为(旧排序规则)选择为新排序规则Lati

我接管了一个数据库。似乎在某个时候,默认数据库排序规则已更改。因此,某些列具有旧的默认排序规则,但更改排序规则后添加的新列具有新的排序规则。还有大量使用联合的存储过程代码。当代码执行时,我恰好得到

无法解决SELECT语句中第5列的排序规则冲突。

错误(例如,第一个选择返回排序规则A中的列,而第二个选择返回排序规则B中的列)。是否有一种方法可以编写一个SQL,例如选择所有列,将排序规则SQL\u Latin1\u General\u CP1\u CI\u作为(旧排序规则)选择为新排序规则Latin1\u General\u CI\u作为


谢谢

像这样的东西应该可以奏效

  • 查找具有不正确排序规则的所有列
  • 为每个不正确的列编写alter table语句和alter column语句

    DECLARE @sql nvarchar(4000) 
          , @tablename sysname
          , @name sysname
          , @datatype sysname
          , @length int
          , @precision int
          , @scale int
          , @is_nullable bit
    
    DECLARE cur_collations CURSOR LOCAL READ_ONLY
    FOR SELECT tablename = object_name(object_id)
             , name
             , TYPE_NAME(user_type_id)
             , max_length
          FROM sys.columns 
         WHERE collation_name = 'SQL_Latin1_General_CP1_CI_AS'
    
    OPEN cur_collations
    
    FETCH NEXT FROM cur_collations INTO @tablename, @name, @datatype, @length
    
    WHILE (@@fetch_status <> -1)
      BEGIN
        IF (@@fetch_status <> -2)
          BEGIN
              set @sql = N'
                ALTER TABLE ' + QUOTENAME(@tablename) + N'
                ALTER COLUMN ' + QUOTENAME(@name) + N' ' + QUOTENAME(@datatype) + N'(' + cast(@length as nvarchar(10)) + N') 
                COLLATE Latin1_General_CI_AS
                ' + case when @is_nullable = 1 then N'NULL' else N'NOT NULL' end + N' '
              EXEC (@sql)
          END
        FETCH NEXT FROM cur_collations INTO @tablename, @name, @datatype, @length
      END
    
    CLOSE cur_collations
    DEALLOCATE cur_collations
    
    DECLARE@sql-nvarchar(4000)
    ,@tablename sysname
    ,@name sysname
    ,@datatype sysname
    ,@length int
    ,@precision int
    ,@scale int
    ,@是可为空的位
    声明当前排序规则游标本地只读
    对于SELECT tablename=object\u name(object\u id)
    名称
    ,类型名称(用户类型id)
    ,最大长度
    从sys.columns
    其中排序规则名称='SQL\u拉丁1\u通用\u CP1\u CI\u AS'
    开放cur_排序规则
    从cur_排序规则获取下一个到@tablename、@name、@datatype、@length
    WHILE(@@fetch\u状态-1)
    开始
    如果(@@fetch_状态-2)
    开始
    设置@sql=N'
    更改表'+QUOTENAME(@tablename)+N'
    更改列'+QUOTENAME(@name)+N''+QUOTENAME(@datatype)+N'('+cast(@length as-nvarchar(10))+N')
    核对拉丁语1_General_CI_AS
    “+当@is_nullable=1时,则N'NULL'否则N'NOT NULL'结束+N”
    EXEC(@sql)
    终止
    从cur_排序规则获取下一个到@tablename、@name、@datatype、@length
    终止
    关闭当前排序规则
    取消分配cur_排序规则
    

像这样的东西应该可以奏效

  • 查找具有不正确排序规则的所有列
  • 为每个不正确的列编写alter table语句和alter column语句

    DECLARE @sql nvarchar(4000) 
          , @tablename sysname
          , @name sysname
          , @datatype sysname
          , @length int
          , @precision int
          , @scale int
          , @is_nullable bit
    
    DECLARE cur_collations CURSOR LOCAL READ_ONLY
    FOR SELECT tablename = object_name(object_id)
             , name
             , TYPE_NAME(user_type_id)
             , max_length
          FROM sys.columns 
         WHERE collation_name = 'SQL_Latin1_General_CP1_CI_AS'
    
    OPEN cur_collations
    
    FETCH NEXT FROM cur_collations INTO @tablename, @name, @datatype, @length
    
    WHILE (@@fetch_status <> -1)
      BEGIN
        IF (@@fetch_status <> -2)
          BEGIN
              set @sql = N'
                ALTER TABLE ' + QUOTENAME(@tablename) + N'
                ALTER COLUMN ' + QUOTENAME(@name) + N' ' + QUOTENAME(@datatype) + N'(' + cast(@length as nvarchar(10)) + N') 
                COLLATE Latin1_General_CI_AS
                ' + case when @is_nullable = 1 then N'NULL' else N'NOT NULL' end + N' '
              EXEC (@sql)
          END
        FETCH NEXT FROM cur_collations INTO @tablename, @name, @datatype, @length
      END
    
    CLOSE cur_collations
    DEALLOCATE cur_collations
    
    DECLARE@sql-nvarchar(4000)
    ,@tablename sysname
    ,@name sysname
    ,@datatype sysname
    ,@length int
    ,@precision int
    ,@scale int
    ,@是可为空的位
    声明当前排序规则游标本地只读
    对于SELECT tablename=object\u name(object\u id)
    名称
    ,类型名称(用户类型id)
    ,最大长度
    从sys.columns
    其中排序规则名称='SQL\u拉丁1\u通用\u CP1\u CI\u AS'
    开放cur_排序规则
    从cur_排序规则获取下一个到@tablename、@name、@datatype、@length
    WHILE(@@fetch\u状态-1)
    开始
    如果(@@fetch_状态-2)
    开始
    设置@sql=N'
    更改表'+QUOTENAME(@tablename)+N'
    更改列'+QUOTENAME(@name)+N''+QUOTENAME(@datatype)+N'('+cast(@length as-nvarchar(10))+N')
    核对拉丁语1_General_CI_AS
    “+当@is_nullable=1时,则N'NULL'否则N'NOT NULL'结束+N”
    EXEC(@sql)
    终止
    从cur_排序规则获取下一个到@tablename、@name、@datatype、@length
    终止
    关闭当前排序规则
    取消分配cur_排序规则
    
更新

  • 支持模式
  • 正确实现是可为空的
更新

  • 支持模式
  • 正确实现是可为空的
看起来棒极了:)我很快就会试试。谢谢!太棒了:)我很快会试试的。谢谢