Как вывести список заголовков столбцов таблицы SQL Server, используя sp_help? - PullRequest
0 голосов
/ 30 марта 2010

У меня есть несколько таблиц с 70-80 столбцами в них.Я хотел бы заполнить их несколько случайными данными, если только я не смогу сделать это из-за нарушения ключа и т. Д.

Первым шагом было бы просто получить список всех заголовков.Кажется, есть два пути:

A) Запустите select * from table_of_interest; в MSFT SQL Server Management Studio 2008. Теперь щелкните правой кнопкой мыши результат и выберите «Копировать с заголовками».Однако я получаю ноль строк назад, и когда я пытаюсь ничего не копировать + заголовки, я получаю:

TITLE: Microsoft SQL Server Management Studio
------------------------------

Value cannot be null.
Parameter name: data (System.Windows.Forms)

------------------------------
BUTTONS:

OK
------------------------------

Это похоже на ошибку ... во всяком случае ... есть другой путь.

B) Я могу запустить sp_help table_of_interest;.Тем не менее, я получаю слишком много назад.Я получаю 7 разных столов назад, но меня интересует только второй.Столбцы второй таблицы:

Column_name | Type | Computed | Length | Prec | Scale | Nullable | 
TrimTrailingBlanks | FixedLenNullInSource | Collation

Меня могут заинтересовать только Column_name и Type, но, возможно, другие столбцы.

Итак ... поскольку sp_help, вероятно,запускает кучу запросов ... как мне попасть под капот?Как я могу выполнить второй запрос И отфильтровать число интересующих меня столбцов?

Большое спасибо!

1 Ответ

3 голосов
/ 30 марта 2010

попробуйте это:

select
    c.COLUMN_NAME ,c.DATA_TYPE ,c.CHARACTER_MAXIMUM_LENGTH,c.NUMERIC_PRECISION,c.NUMERIC_PRECISION_RADIX ,c.NUMERIC_PRECISION_RADIX,c.NUMERIC_SCALE,c.DATETIME_PRECISION 
        --t.TABLE_CATALOG,t.TABLE_SCHEMA,t.TABLE_NAME
    from INFORMATION_SCHEMA.Tables            t
        INNER JOIN INFORMATION_SCHEMA.Columns c ON t.TABLE_CATALOG=c.TABLE_CATALOG AND t.TABLE_SCHEMA=c.TABLE_SCHEMA AND t.TABLE_NAME=c.TABLE_NAME
    WHERE t.TABLE_NAME='YourTableName' --<<<<
    ORDER BY --t.TABLE_CATALOG,t.TABLE_SCHEMA,t.TABLE_NAME,
        c.ORDINAL_POSITION

Я не уверен, если вы хотите, чтобы тип данных не, и если вы хотите только одну таблицу или все, вы можете изменить при необходимости.

РЕДАКТИРОВАТЬ после комментария ОП:

вот процедура, если вам нужно, чтобы при необходимости в качестве параметра раскомментировали table_catalog и table_schema:

CREATE PROCEDURE GetColumnNames
(
    --@TABLE_CATALOG nvarchar(128),
    --@TABLE_SCHEMA  nvarchar(128),
    @TableName   sysname
)
AS
select
    c.COLUMN_NAME 
        ,CASE 
             WHEN DATA_TYPE IN ('int','smalldatetime','datetime','smallint','bigint')THEN DATA_TYPE
             WHEN DATA_TYPE='char' THEN 'char('+CONVERT(varchar(5),CHARACTER_MAXIMUM_LENGTH)+')'
             WHEN DATA_TYPE='varchar' THEN 'varchar('+CONVERT(varchar(5),CHARACTER_MAXIMUM_LENGTH)+')'
             WHEN DATA_TYPE='numeric' THEN 'numeric('+CONVERT(varchar(5),NUMERIC_PRECISION)+','+CONVERT(varchar(5),NUMERIC_SCALE)+')'
             WHEN DATA_TYPE='decimal' THEN 'decimal('+CONVERT(varchar(5),NUMERIC_PRECISION)+','+CONVERT(varchar(5),NUMERIC_SCALE)+')'
             ELSE DATA_TYPE
         END AS DataType
        ,c.DATA_TYPE ,c.CHARACTER_MAXIMUM_LENGTH,c.NUMERIC_PRECISION,c.NUMERIC_PRECISION_RADIX ,c.NUMERIC_PRECISION_RADIX,c.NUMERIC_SCALE,c.DATETIME_PRECISION 
    from INFORMATION_SCHEMA.Columns c
    WHERE c.TABLE_NAME=@TableName --AND c.TABLE_CATALOG=@TABLE_CATALOG AND c.TABLE_SCHEMA=@TABLE_SCHEMA
    ORDER BY c.ORDINAL_POSITION

RETURN 0
GO

используйте это так:

exec GetColumnNames 'yourtablename'

INFORMATION_SCHEMA.Columns содержит несколько столбцов, которые могут вас заинтересовать, поэтому прочитайте документ и измените запрос так, как вам нужно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...