Как создать сценарий создания таблицы с помощью SQL-запроса в SQL Server
Я хочу создать сценарий создания таблицы уже созданной таблицы в моей живой базе данных.
Я знаю, что мы можем создавать скрипты, используя правый клик по таблице и нажмите "таблица скриптов как" меню и скрипт будет создан. Потому что мой Live db UI работает очень медленно.
Я хочу сделать тот же процесс, используя SQL-запрос. есть ли какой-нибудь способ??
3 ответов
Если вы ищете решение TSQL, это довольно многословно, как показывает.
более короткой альтернативой будет использование библиотека SMO (пример)
(Я первоначально ответил на это здесь, но SQL Server-только разработчики, вероятно, не связывают заголовок вопроса с этой проблемой)
для более полного (- ish) решения для генерации CREATE TABLE
оператор с индексами, триггерами и ограничениями попробуйте хранимая процедура сделано Лоуэлл Исагирре.
Он был протестирован и разработан с 2004 года, последнее обновление было в 2013 году.
Я также сделал некоторые улучшения, чтобы включить параметры индекса (PAD_INDEX
, FILLFACTOR
, IGNORE_DUP_KEY
):
вот изменения, не могут соответствовать всему коду, поэтому вы найдете полную измененную версию на http://pastebin.com/LXpBeuN1 .
обновление
Я поговорил с Лоуэллом, и новая версия скоро будет в сети с новыми изменениями для параметров индекса и других улучшений.
используйте этот запрос :
DROP FUNCTION [dbo].[Get_Table_Script]
Go
Create Function Get_Table_Script
(
@vsTableName varchar(50)
)
Returns
VarChar(Max)
With ENCRYPTION
Begin
Declare @ScriptCommand varchar(Max)
Select @ScriptCommand =
' Create Table [' + SO.name + '] (' + o.list + ')'
+
(
Case
When TC.Constraint_Name IS NULL
Then ''
Else 'ALTER TABLE ' + SO.Name + ' ADD CONSTRAINT ' +
TC.Constraint_Name + ' PRIMARY KEY ' + ' (' + LEFT(j.List, Len(j.List)-1) + ')'
End
)
From sysobjects As SO
Cross Apply
(
Select
' [' + column_name + '] ' +
data_type +
(
Case data_type
When 'sql_variant'
Then ''
When 'text'
Then ''
When 'decimal'
Then '(' + Cast( numeric_precision_radix As varchar ) + ', ' + Cast( numeric_scale As varchar ) + ') '
Else Coalesce( '(' +
Case
When character_maximum_length = -1
Then 'MAX'
Else Cast( character_maximum_length As VarChar )
End + ')' , ''
)
End
)
+ ' ' +
(
Case
When Exists (
Select id
From syscolumns
Where
( object_name(id) = SO.name )
And
( name = column_name )
And
( columnproperty(id,name,'IsIdentity') = 1 )
)
Then 'IDENTITY(' +
Cast( ident_seed(SO.name) As varchar ) + ',' +
Cast( ident_incr(SO.name) As varchar ) + ')'
Else ''
End
) + ' ' +
(
Case
When IS_NULLABLE = 'No'
Then 'NOT '
Else ''
End
) + 'NULL ' +
(
Case
When information_schema.columns.COLUMN_DEFAULT IS NOT NULL
Then 'DEFAULT ' + information_schema.columns.COLUMN_DEFAULT
ELse ''
End
) + ', '
From information_schema.columns
Where
( table_name = SO.name )
Order by ordinal_position
FOR XML PATH('')) o (list)
Inner Join information_schema.table_constraints As TC On (
( TC.Table_name = SO.Name )
AND
( TC.Constraint_Type = 'PRIMARY KEY' )
And
( TC.TABLE_NAME = @vsTableName )
)
Cross Apply
(
Select '[' + Column_Name + '], '
From information_schema.key_column_usage As kcu
Where
( kcu.Constraint_Name = TC.Constraint_Name )
Order By ORDINAL_POSITION
FOR XML PATH('')
) As j (list)
Where
( xtype = 'U' )
AND
( Name NOT IN ('dtproperties') )
Return @ScriptCommand
End
и вы можете запустить этот Function
такой :
Select [dbo].Get_Table_Script '<Your_Table_Name>'
и для создания триггера используйте это
SELECT
DB_NAME() AS DataBaseName,
dbo.SysObjects.Name AS TriggerName,
dbo.sysComments.Text AS SqlContent
FROM
dbo.SysObjects INNER JOIN
dbo.sysComments ON
dbo.SysObjects.ID = dbo.sysComments.ID
WHERE
(dbo.SysObjects.xType = 'TR')
AND
dbo.SysObjects.Name LIKE '<Trigger_Name>'