2017-11-27 8 views
0

nvarchar/ ncharからvarchar/charにすべての列の種類を更新するために使用できるクエリテキストを生成するには、sqlserver queryがあります。インデックスsqlserverに列が存在するかどうかをテストします

SELECT 
    AlterSql = CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' ALTER COLUMN ', COLUMN_NAME, ' ', SUBSTRING(DATA_TYPE, 2, LEN(DATA_TYPE)), '(', CHARACTER_MAXIMUM_LENGTH, ') ', CASE IS_NULLABLE WHEN 'YES' THEN 'NULL' WHEN 'NO' THEN 'NOT NULL' ELSE 'ERROR' END, CHAR(13), CHAR(10), 'GO') 
    , * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE IN ('nchar', 'nvarchar') 

問題を実行すると、インデックスに列がキャストできないというエラーが表示されます。

インデックスが存在するかどうかをテストし、インデックスを削除し、インデックスを作成して再作成する必要があります。

スクリプトを変更するにはどうすればよいですか? どうもありがとう

+1

なぜncharまたはnvarcharのすべての単一の列を対応する列に変換しようとしていますか?システムに格納できるデータを制限しており、潜在的に情報を失う可能性があります。 –

+0

空き領域を解放することは、格納可能なデータを制限する有効な理由ではありません。あなたが100%以上のASCII文字セット以外の値を受け取ったことがないと確信していない限り、これは単なるひどい考えです。 –

答えて

0

まずそうして

IF EXISTS (
       SELECT * FROM dbo.sysobjects WHERE id = 
       OBJECT_ID(N'[CONSTRAINTNAME]') AND type = 'D' 
      ) 
BEGIN 
    ALTER TABLE [dbo].[_COMPANY] DROP CONSTRAINT [CONSTRAINTNAME] 
END 

を以下のようにドロップした場合、あなたは、CONSTRAINT終了を確認するかべきではありませんそして、あなたの文を使用し

SELECT 
    AlterSql = CONCAT('ALTER TABLE ', TABLE_SCHEMA, '.', TABLE_NAME, ' ALTER COLUMN ', COLUMN_NAME, ' ', SUBSTRING(DATA_TYPE, 2, LEN(DATA_TYPE)), '(', CHARACTER_MAXIMUM_LENGTH, ') ', CASE IS_NULLABLE WHEN 'YES' THEN 'NULL' WHEN 'NO' THEN 'NOT NULL' ELSE 'ERROR' END, CHAR(13), CHAR(10), 'GO') 
    , * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE DATA_TYPE IN ('nchar', 'nvarchar') 
+0

私は、彼らが彼らの前のすべての名前を知らないので、彼らが制約を見つけるクエリを持つことを望んでいると思います。 –

0

プロシージャsp_helpindexは何をします、いあなたはそれをメモリ内のテーブルに入れて実行することができます。

declare @t table 
(
index_name sysname collate database_default NOT NULL, 
index_description nvarchar(512) , 
index_keys sysname 
) 
insert into @t exec sp_helpIndex 'items' 
--do whatever with this data here 
select * from @t 

そして私はSean Langeの質問に参加します。なぜそれが必要なのですか?

+0

データベース内の空き領域を解放するには、nvrcharとncharがより多くの領域を必要とするため – vero

関連する問題