Вы можете использовать следующую хранимую процедуру для создания типа с той же схемой, что и существующая таблица.
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'