Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Создание таблицы из структуры другой таблицы  [new]
Пашок
Member

Откуда:
Сообщений: 287
select * 
into #grid_column
from forms_columns 
where 1=2

Всем доброго времени суток, можно как-то изящнее подобное сделать ?

p.s. создаю временную таблицу, структуру нужно точно сделать как реальная таблица
9 авг 11, 23:13    [11094511]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы из структуры другой таблицы  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Пашок,

Можно начитать DDL иструкцию и через динамический SQL.

p.s. А зачем изящнее?
10 авг 11, 09:23    [11095149]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы из структуры другой таблицы  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Пашок
структуру нужно точно сделать как реальная таблица


Могу предложить:
use AdventureWorks2008R2
IF OBJECT_ID('dbo.ufn_CopyTblStruct') IS NOT NULL DROP FUNCTION dbo.ufn_CopyTblStruct
GO

CREATE FUNCTION dbo.ufn_CopyTblStruct(
	@sname sysname, --name of schema
	@tname sysname, --name of table
	@columns VARCHAR(8000) --list of columns in table separated by comma
) RETURNS NVARCHAR(MAX)
AS
BEGIN
DECLARE @RetVal NVARCHAR(MAX)
SELECT @RetVal=COALESCE(@RetVal+',','') + sys.columns.name + ' ' + sys.types.name +
	case when sys.types.name like('%char')
		then '(' + 
				case
					when sys.columns.max_length = -1 then 'MAX'
					when sys.types.name like('n%') then ltrim(sys.columns.max_length/2)
					else ltrim(sys.columns.max_length)
				end
			+ ')'
	when sys.types.name in('numeric','decimal')
		then '(' + ltrim(sys.columns.precision) + ',' + ltrim(sys.columns.scale) + ')'
	else ''
	end
	+
	case sys.columns.is_nullable
		when 1 then ' NULL'
		else ' NOT NULL'
	end
from
	sys.columns inner join sys.types on sys.columns.system_type_id=sys.types.system_type_id AND sys.columns.system_type_id=sys.types.user_type_id
	inner join sys.tables on sys.columns.object_id=sys.tables.object_id
	inner join sys.schemas on sys.tables.schema_id=sys.schemas.schema_id
where
	sys.schemas.name=@sname AND
	sys.tables.name=@tname AND
	sys.columns.name IN (select [Value] from dbo.ufn_fnSplit(@columns,','))

SET @RetVal = 'create table ' + @sname + '.' + @tname + char(10) + '(' + char(10) + char(9) + @RetVal + char(10) +')'
RETURN @RetVal
END
GO
--Test the wokrs & clean
SELECT dbo.ufn_CopyTblStruct('Sales','SalesOrderDetail','SalesOrderID,CarrierTrackingNumber,OrderQty,UnitPrice,LineTotal')
DROP FUNCTION dbo.ufn_CopyTblStruct
--Output:
--create table Sales.SalesOrderDetail
--(
--	SalesOrderID int NOT NULL,CarrierTrackingNumber nvarchar(25) NULL,OrderQty smallint NOT NULL,UnitPrice money NOT NULL,LineTotal numeric(38,6) NOT NULL
--)

Если ф-ии распарсивания не имеете - то и она, для комплектУ:
use AdventureWorks2008R2
IF OBJECT_ID('dbo.ufn_fnSplit') IS NOT NULL DROP FUNCTION dbo.ufn_ufn_fnSplit
GO
CREATE FUNCTION dbo.ufn_fnSplit(
	@List varchar(8000), 
    @Delimiter varchar(5)
) 
RETURNS @TableOfValues table (
	RowID smallint IDENTITY(1,1), 
    [Value] varchar(50) 
) 
AS 
BEGIN
	DECLARE @LenString int 
	WHILE len(@List) > 0 
		BEGIN
			SELECT @LenString = 
               (CASE charindex(@Delimiter, @List) 
                   WHEN 0 THEN len(@List)
                   ELSE (charindex(@Delimiter,@List )-1)
                END) 
            INSERT INTO @TableOfValues SELECT substring(@List,1,@LenString)
            SELECT @List = 
               (CASE (len(@List)-@LenString) 
                   WHEN 0 THEN ''
                   ELSE right(@List,len(@List)-@LenString-1) 
                END) 
         END
      RETURN 
END
GO
--Test the wokrs & clean
SELECT * FROM dbo.ufn_fnSplit('Person,Name,Age,24-78,@@~$$,%%%,999',',')
DROP FUNCTION dbo.ufn_fnSplit
--Output:
--RowID	Value
--1	Person
--2	Name
--3	Age
--4	24-78
--5	@@~$$
--6	%%%
--7	999

Возможно не абсолютно универсальное решение, но - решение.
10 авг 11, 14:21    [11097958]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы из структуры другой таблицы  [new]
where10
Guest
Пашок
select * 
into #grid_column
from forms_columns 
where 1=2

Всем доброго времени суток, можно как-то изящнее подобное сделать ?

p.s. создаю временную таблицу, структуру нужно точно сделать как реальная таблица


изящнее:

where 1=0
10 авг 11, 14:32    [11098059]     Ответить | Цитировать Сообщить модератору
 Re: Создание таблицы из структуры другой таблицы  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
where10
Пашок
select * 
into #grid_column
from forms_columns 
where 1=2

Всем доброго времени суток, можно как-то изящнее подобное сделать ?

p.s. создаю временную таблицу, структуру нужно точно сделать как реальная таблица


изящнее:

where 1=0
Ещё изящнее TOP 0 без всякого WHERE
Или WHERE NULL IS NOT NULL - чем не прекрасно?
10 авг 11, 14:43    [11098155]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить