Как СОЗДАТЬ ТИП type_name AS - PullRequest
3 голосов
/ 04 августа 2011

Есть ли способ создать тип таблицы в SQL Server 2008 на основе схемы существующей таблицы?

CREATE TABLE A (id INT, name VARCHAR(30))

CREATE TYPE type_a AS TABLE.A

Нечто подобное.

Ответы [ 3 ]

3 голосов
/ 29 марта 2014

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

Create PROCEDURE [dbo].[Sp_DefineTypeOutOfTableSchema]
@TableNames NVARCHAR(500)
AS
BEGIN

DECLARE @TableName NVARCHAR(100)
DECLARE @strSQL NVARCHAR(max)
DECLARE @strSQLCol NVARCHAR(1000)
DECLARE @ColName NVARCHAR(100)
DECLARE @ColDataTaype NVARCHAR(50)
DECLARE @ColDefault NVARCHAR(50)
DECLARE @ColIsNulable NVARCHAR(50)
DECLARE @ColCharMaxlen NVARCHAR(50)
DECLARE @ColNumPrec NVARCHAR(50)
DECLARE @ColNumScal NVARCHAR(50)


IF LEN(@TableNames) > 0 SET @TableNames = @TableNames + ',' 

WHILE LEN(@TableNames) > 0 
BEGIN

    SELECT @TableName = LTRIM(SUBSTRING(@TableNames, 1, CHARINDEX(',', @TableNames) - 1))

    DECLARE schemaCur CURSOR FOR 
    SELECT COLUMN_NAME,DATA_TYPE,IS_NULLABLE,COLUMN_DEFAULT,CHARACTER_MAXIMUM_LENGTH,NUMERIC_PRECISION,NUMERIC_SCALE  FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =@TableName

    OPEN schemaCur

    SELECT @strSQL=''

    FETCH NEXT FROM schemaCur
    INTO @ColName,@ColDataTaype,@ColIsNulable,@ColDefault,@ColCharMaxlen,@ColNumPrec,@ColNumScal

    WHILE @@FETCH_STATUS = 0
    BEGIN
        SELECT @strSQLCol=''
        SELECT @strSQLCol= '['+@ColName+'] '+'[' + @ColDataTaype +'] '

        IF @ColDataTaype='nvarchar' or @ColDataTaype='char'  or @ColDataTaype='varchar' or @ColDataTaype='vchar'
            BEGIN
                SELECT @strSQLCol=@strSQLCol+ '(' + @ColCharMaxlen +') '
            END 
        ELSE IF @ColDataTaype='numeric' or @ColDataTaype='decimal' 
            BEGIN
                SELECT @strSQLCol=@strSQLCol +'(' + @ColNumPrec +',' +@ColNumScal + ') '
            END 

        IF @ColIsNulable='YES'
            BEGIN
                SELECT @strSQLCol=@strSQLCol+ 'NULL '
            END 
        ELSE
            BEGIN
                SELECT @strSQLCol=@strSQLCol+ ' NOT NULL '
            END 
        IF @ColDefault IS NOT NULL
            BEGIN
                SELECT @strSQLCol=@strSQLCol+ ' DEFAULT(' +@ColDefault + '),'
            END 
        ELSE
            BEGIN
                SELECT @strSQLCol=@strSQLCol+ ' ,'
            END

        SELECT @strSQL=@strSQL+@strSQLCol
            --print @strSQL
        FETCH NEXT FROM schemaCur
        INTO @ColName,@ColDataTaype,@ColIsNulable,@ColDefault,@ColCharMaxlen,@ColNumPrec,@ColNumScal

    END

    CLOSE schemaCur
    DEALLOCATE schemaCur

    --print @strSQL
    SELECT @strSQL=left( @strSQL, len(@strSQL)-1)
    --print @strSQL

    IF EXISTS (SELECT * FROM sys.types WHERE IS_TABLE_TYPE = 1 AND name = 't_' +@TableName)
    BEGIN           
        EXEC('DROP TYPE t_' +@TableName )
    END

    SELECT @strSQL =  'CREATE TYPE t_' + @TableName + ' AS TABLE (' +  @strSQL + ')'
    --print @strSQL
    EXEC (@strSQL)
    SELECT @TableNames = SUBSTRING(@TableNames, CHARINDEX(',', @TableNames) + 1, LEN(@TableNames))
END
END

вы можете использовать это так

Exec Sp_DefineTypeOutOfTableSchema 'Table1name,Table2name'
3 голосов
/ 04 августа 2011

Нет, этот вид компоновки DML пока невозможен. В прошлом Microsoft отклоняла это предложение, но при достаточном количестве голосов (например, более 1!) Оно может быть пересмотрено в будущем:

http://connect.microsoft.com/SQLServer/feedback/details/294130/table-valued-parameters-add-support-for-create-type-type-from-table-table-name-options-syntax-construct

0 голосов
/ 04 августа 2011

Вы можете поэкспериментировать с созданием функции, которая извлекает определение таблицы из sysobjects, systypes, syscolumns, syscomments и т. Д., И создает из нее оператор CREATE. Вам просто нужно убедиться, что вы извлекли все важные части (столбцы, ограничения, комментарии и т. Д.) Из различных таблиц sys.

Тогда назовите это как ... EXEC myCREATEtable @template_table_name или что-то подобное ...

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