2011-06-24 41 views
2

我們正在將SQL Server 2008數據庫中某一列的數據類型從varchar(900)更改爲nvarchar(900)。這將導致列的數據大小從900字節變爲1800字節。針對字符數據類型大小的查詢SQL Server系統表

此列包含在索引,當我們做出改變的指標,我們得到警告

*警告!最大密鑰長度是900字節。索引'INX_SomeTable'的最大長度爲1800字節。對於某些較大值的組合,插入/更新操作將失敗。*

我們計劃通過將字段大小從nvarchar(900)減小到nvarchar(450)來解決此問題。我希望確保沒有欄位超過450個字符。

如何查詢系統表或DMV以查找超過特定大小的所有字符字段(varchar或nvarchar)?

回答

1
SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE CHARACTER_MAXIMUM_LENGTH > 450 
+0

這正是我需要的。謝謝!通過限制回來的列可以稍微改進這個答案。 –

1

更新答案...

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMNS.DATA_TYPE IN ('nvarchar', 'varchar', 'char', 'nchar') 
    AND CHARACTER_MAXIMUM_LENGTH > 450 
+0

他想要一個** FIELDS **的列表,這是返回一個表和視圖列表。另外我認爲你正在查看不推薦使用的SQL 2000系統表。 – JNK

+0

謝謝。我剛剛運行了一些類似的東西,但是你是對的......我用這個查詢返回表格。 – Narnian

+0

我也想考慮數據類型VARCHAR,CHAR和NCHAR。 –

1
select OBJECT_NAME(object_id) as 'TableorView', name 
from DB.sys.columns 
WHERE system_type_id IN (167, 231, 175, 239) 
AND max_length > 450 

我以防萬一包括系統類型CHARNCHAR爲好。

如果您需要其他類型,您可以在sys.types中查看列表。

+0

這似乎沒有返回我正在尋找的表和列的列表。 –

+0

@Eric - 您需要用您的數據庫名稱替換「DB」,或者如果您位於要檢查的數據庫上下文中,請將其刪除。 – JNK

+0

好的,那有效。謝謝。 –

1

這裏是一個結果集,其中包含模式和限制,只是您想要檢索的類型。

SELECT 
      sch.name as 'Schema' 
,   OBJECT_NAME(col.object_id) as 'TableorView' 
,   col.name as 'Column' 
,   typ.name + ' (' + convert(varchar,col.max_length) + ')' as 'Type' 
FROM  sys.objects AS o WITH (NOLOCK) 
INNER JOIN sys.schemas sch WITH (NOLOCK) 
ON   o.schema_id = sch.schema_id 
INNER JOIN sys.columns col 
ON   o.object_id = col.object_id 
INNER JOIN sys.types typ 
ON   col.system_type_id = typ.system_type_id 
WHERE  col.system_type_id IN (
       SELECT system_type_id 
       FROM sys.types 
       WHERE name IN ('CHAR', 'NCHAR')  --Add Types you want here 
       ) 
AND   sch.name NOT IN ('sys')     --Add schemas you don't want here 
ORDER BY 1,2,3 
相關問題