2014-09-09 9 views
0

Мне нужно изменить размер двух столбцов varchar - один из них является частью PK, другой - ограниченным ограничением. Простой размер * не работает из-за CONSTRAINT. Поэтому я решил, что мне придется отказаться от ограничений, изменить таблицу и снова добавить ограничения. Или есть более легкое решение?Изменить размер столбца, который является частью ПК. Узнать длину столбца

Если нет, я бы лучше спал, если бы это было сделано только в том случае, если столбцы не имеют нужного размера. Как узнать, какая максимальная длина поддерживается столбцом varchar?

EDIT:
* Я попытался использовать ALTER TABLE users ALTER COLUMN name VARCHAR(50), чтобы изменить размер поддерживаемого на 50 символов вместо 30, что было немного коротким. Эта операция завершается с сообщением об ошибке, в котором указано, что name является столбцом под ограничением UNIQUE UQ_users.

+0

Вместо использования SSMS его лучше изменить с помощью запроса. например: 'ALTER TABLE table_name ALTER COLUMN column_name datatype'. Я думаю, что это то, что вы хотите сделать правильно? –

+0

@ KrishnrajRana Это то, что я хочу сделать, но он терпит неудачу. Я не играю в SSMS point & click adventure, я использую кнопку «новый запрос». – Alexander

+0

Я думаю, что в вашем случае вам нужно временно отключить ограничение и изменить колонку. Просматривайте и тестируйте в adventureDB. –

ответ

1

Это даст вам информацию о любой схеме, необходимую для всей базы данных. Вы можете выбрать его по мере необходимости.

SELECT 
    dbo.sysobjects.name AS tblName, dbo.syscolumns.name AS fldName, dbo.systypes.name AS Type, sys.extended_properties.[value] AS Descript, dbo.syscolumns.xprec, dbo.syscolumns.xscale, dbo.syscolumns.length, PK.cnt AS PrmryKey, FK.cnt AS FrnKey, dbo.syscolumns.isnullable, dbo.syscomments.text AS DefaultVal 
FROM dbo.sysobjects 
    INNER JOIN dbo.syscolumns 
     ON dbo.sysobjects.id = dbo.syscolumns.id 
    INNER JOIN dbo.systypes 
     ON dbo.syscolumns.xtype = dbo.systypes.xusertype 
    LEFT OUTER JOIN dbo.syscomments 
     ON dbo.syscolumns.cdefault = dbo.syscomments.id 
    LEFT OUTER JOIN sys.extended_properties 
     ON dbo.syscolumns.id = sys.extended_properties.major_id 
      AND dbo.syscolumns.colid = sys.extended_properties.minor_id 
    LEFT OUTER JOIN (
      SELECT 1 as CNT, ic.OBJECT_ID,ic.column_id 
      FROM sys.indexes AS i 
       INNER JOIN sys.index_columns AS ic 
        ON i.OBJECT_ID = ic.OBJECT_ID 
         AND i.index_id = ic.index_id 
      WHERE i.is_primary_key = 1) PK 
     on dbo.syscolumns.id = PK.object_id 
      AND dbo.syscolumns.colid = PK.column_id 
    LEFT OUTER JOIN (
      SELECT fkeyid, fkey, COUNT(*) AS cnt 
      FROM sysforeignkeys 
      GROUP BY fkeyid, fkey) FK 
     ON dbo.syscolumns.id = FK.fkeyid 
      AND dbo.syscolumns.colid = FK.fkey 
WHERE (dbo.sysobjects.xtype = 'U' OR dbo.sysobjects.xtype = 'V') 
    AND (dbo.sysobjects.name <> N'dtproperties') 
    AND (dbo.sysobjects.name <> N'sysconstraints') 
    AND (dbo.sysobjects.name <> N'syssegments') 
--ORDER BY dbo.sysobjects.name, dbo.syscolumns.name 
+0

Вы должны обновить свой фрагмент, чтобы использовать текущие представления. sysobjects для обратной совместимости для sql 2000. sys.objects, sys.columns и т. д. –

+0

Но это работает в большинстве версий, и OP не указывал версию. – Steve

+0

Согласовано. Не было критического. Просто предлагаю вам обновить фрагмент кода. Поддержка 2k на самом деле не очень важна, поскольку продукт уже давно не поддерживается. –

Смежные вопросы