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

Откуда:
Сообщений: 266
есть таблица, в ней данные
надо сделать скрипт вставки этих данных

есть такая возможность (стандартными средствами, не хочется собирать этот скрипт написанием селекта)?
2 сен 05, 12:37    [1840378]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Если скрипт не принципиален, то можно воспользоваться backup/restore, attach/detach.

Если надо именно скриптом, то стандартных средств нет, есть продукты третьих фирм:
https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=174190#1449591
2 сен 05, 12:39    [1840389]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
Alexander V. Mishneen
Member

Откуда: Третья столица
Сообщений: 66
скриптом можно. я такое делал под ораклом. но скрипт получается весьма большим и трудночитаем
2 сен 05, 12:48    [1840443]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
vooo
Member

Откуда:
Сообщений: 1316
Нужен именно скрипт ?
A bcp [out/in] не подойдут ?
2 сен 05, 12:49    [1840448]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
neal
Member

Откуда: Сердце Москвы
Сообщений: 492
Может лучше скриптом перенести в другую базу (состоящую из этой одной таблицы), сделать бекап этой маленькой базы, запаковать архиватором, отправить по электронной почте архив и скрипт перегоняющий данные из этой маленькой базы в базу, куда нужно вставить эти данные.

Преимущества этого метода по сравнению со скриптом:
1)можно переслать те объекты, которые нельзя конвертировать в (n)varchar, т.е. поля с изображениями
2)можно перед заливкой данных проверить на совпадения/различия и т.п., в скрипте такое сделать трудоемко.
3)не нужно обрабатывать текстовые данные значений на предмет кавычек, спецсимволов, встроенных команд TSQL

Недостатки этого метода:
Больший размер архива.
Если данные в Вашей таблице только текстовые данные за которые Вы ручаетесь, что они не содержат плохих символов (хотя ручаться никогда не стоит), то размер чисто скрипта таблицы будет конечно же меньше упакованного архива маленькой базы.
-------------------------------------------------------
Зависть окружающих - это налог,который платит яркая индивидуальность.(с)Торо.
2 сен 05, 16:20    [1841789]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
UU
Member

Откуда:
Сообщений: 266
дело в том что доступ к серваку (мсде без клиента, так как не Россия с лицензированием все серьезно) только через скрипт.

нашел неплохую бесплатную сторонних разработчиков EMS MS SQL Manager Lite -
8 сен 05, 13:57    [1858957]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
ё
Guest
а что вам мешает через скрипт поднять бекап?
8 сен 05, 14:26    [1859192]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
as is...
create proc IP_SCRIPT_DATA_TABLE
 @TBL_NM sysname
,@NEW_TBL_NM sysname = NULL
,@WHERE varchar(4000) = NULL
,@ORDER varchar(4000) = NULL
,@IDENTITY_INSERT bit = 0
as

set nocount on

if @NEW_TBL_NM is not NULL
	set @TBL_NM=@NEW_TBL_NM

if @WHERE is not NULL set @WHERE=' where '+@WHERE
else set @WHERE=''
if @ORDER is not NULL set @ORDER=' order by '+@ORDER
else set @ORDER=''

declare 
 @TBL_ID int
,@COL_S varchar(8000)
,@COL_S2 varchar(8000)
,@COL_S3 varchar(8000)

create table #C
(
 col_nm sysname
,col_str varchar(1000)
)

select @TBL_ID=OBJECT_ID(@TBL_NM)

insert into #C(col_nm,col_str)
select name,'IsNull(REPLACE(CONVERT(varchar(8000),'
		+case when c.xtype in (175,61,239,99,231,58,98,231,35,36,167) then '''''''''+' else '' end
		+name
		+case when c.xtype in (175,61,239,99,231,58,98,231,35,36,167) then '+''''''''' else '' end
		+'),'''''''''''',''''''''''''''''),''NULL'')'
from syscolumns c
where id=@TBL_ID and (@IDENTITY_INSERT=1 or status&0x80=0) and name<>'rowguid'

set @COL_S=''
set @COL_S2=''
set @COL_S3=''
select @COL_S=@COL_S+col_nm+','
	,@COL_S2=@COL_S2+col_str+'+'',''+'
	,@COL_S3=@COL_S3+'NULL,'
from #C

set @COL_S=LEFT(@COL_S,Len(@COL_S)-1)
set @COL_S2=LEFT(@COL_S2,Len(@COL_S2)-5)
set @COL_S3=LEFT(@COL_S3,Len(@COL_S3)-1)

if @IDENTITY_INSERT=1 select 'SET IDENTITY_INSERT '+@TBL_NM+' ON'

select 'begin tran'

exec (
'select ''
if @@ERR<>0 goto rlbk
insert into ['+@TBL_NM+'] ('+@COL_S+')
select ''+'+@COL_S2+
' from '+@TBL_NM+@WHERE+@ORDER
)

select '
if @@ERR<>0 goto rlbk
commit tran
rlbk:'
if @IDENTITY_INSERT=1 select 'SET IDENTITY_INSERT '+@TBL_NM+' OFF'
select 'if @@TRANCOUNT<>0 rollback tran
'+'GO
'
GO
8 сен 05, 18:46    [1860790]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: содержимое таблицы в скрипт  [new]
SQLDrakon
Member

Откуда:
Сообщений: 4
ura, спасибо, скрипт годный.
Однако, попробовав его у себя, обнаружил некоторые недоработки.
В частности, не работает, если поля типа uniqueidentifier и datetime2
Я его немножко "допилил", вот окончательный вариант (и это в варианте обычного скрипта, а не процедуры, мне так удобнее пользоваться, можно запускать в любом месте).

declare @TBL_NM sysname = 'Table1'
,@NEW_TBL_NM sysname = NULL
,@WHERE varchar(4000) = 'Field1=5'
,@ORDER varchar(4000) = 'Field2'
,@IDENTITY_INSERT bit = 0
,@TBL_ID int
,@COL_S varchar(8000)
,@COL_S2 varchar(8000)
,@COL_S3 varchar(8000)

set nocount on

if @NEW_TBL_NM is not NULL
	set @TBL_NM=@NEW_TBL_NM

if @WHERE is not NULL set @WHERE=' where '+@WHERE
else set @WHERE=''
if @ORDER is not NULL set @ORDER=' order by '+@ORDER
else set @ORDER=''

IF EXISTS(SELECT 1 FROM tempdb.dbo.sysobjects WHERE name = '##C') DROP TABLE ##C -- дропаем временную табличку, если есть

create table ##C
(
 col_nm sysname
,col_str varchar(1000)
)

select @TBL_ID=OBJECT_ID(@TBL_NM)

insert into ##C(col_nm,col_str)
select name,'IsNull(REPLACE(CONVERT(varchar(8000),'
		+case when c.xtype in (175,61,239,99,231,58,98,231,35,36,167,42) then '''''''''+' else '' end
		+case when c.xtype in (36,42) then 'cast(' else '' end
		+name
		+case when c.xtype in (36,42) then ' as varchar(36))' else '' end
		+case when c.xtype in (175,61,239,99,231,58,98,231,35,36,167,42) then '+''''''''' else '' end
		+'),'''''''''''',''''''''''''''''),''NULL'')'
from syscolumns c
where id=@TBL_ID and (@IDENTITY_INSERT=1 or status&0x80=0) and name<>'rowguid'

set @COL_S=''
set @COL_S2=''
set @COL_S3=''
select @COL_S=@COL_S+col_nm+','
	,@COL_S2=@COL_S2+col_str+'+'',''+'
	,@COL_S3=@COL_S3+'NULL,'
from ##C

set @COL_S=LEFT(@COL_S,Len(@COL_S)-1)
set @COL_S2=LEFT(@COL_S2,Len(@COL_S2)-5)
set @COL_S3=LEFT(@COL_S3,Len(@COL_S3)-1)

if @IDENTITY_INSERT=1 select 'SET IDENTITY_INSERT '+@TBL_NM+' ON'

select 'begin tran'

exec (
'select ''
if @@ERR<>0 goto rlbk
insert into ['+@TBL_NM+'] ('+@COL_S+')
select ''+'+@COL_S2+
' from '+@TBL_NM+@WHERE+@ORDER
)

select '
if @@ERR<>0 goto rlbk
commit tran
rlbk:'
if @IDENTITY_INSERT=1 select 'SET IDENTITY_INSERT '+@TBL_NM+' OFF'
select 'if @@TRANCOUNT<>0 rollback tran
'+'GO
'
GO
24 апр 15, 14:39    [17559312]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
Glory
Member

Откуда:
Сообщений: 104751
SQLDrakon
Я его немножко "допилил", вот окончательный вариант

И что он теперь со всеми последними типами данных ?
24 апр 15, 14:41    [17559332]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
SQLDrakon
Member

Откуда:
Сообщений: 4
P.S. что-то не нашел, где отредактировать сообщение (может, плохо искал).
В моем варианте перед запуском надо отредактировать поля - имя таблицы, условие WHERE и сортировку ORDER. Если из последних двух что-то не нужно, то поставить вместо них NULL без кавычек.
24 апр 15, 14:42    [17559339]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
SQLDrakon
Member

Откуда:
Сообщений: 4
Glory,

Он там в одном месте их перед взятием в кавычки сначала конвертит в varchar (так как конкатенация типа uniqueidentifier с текстом напрямую не работает, и datetime2 тоже). И ещё для datetime2 значения заключает в кавычки (раньше это не учитывалось).
24 апр 15, 14:44    [17559358]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8826
SQLDrakon, а стандартный скриптер не пригоден, что ли?
24 апр 15, 14:45    [17559377]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
Glory
Member

Откуда:
Сообщений: 104751
SQLDrakon
Он там в одном месте их перед взятием в кавычки сначала конвертит в varchar (так как конкатенация типа uniqueidentifier с текстом напрямую не работает, и datetime2 тоже).

Вообще-то типа данных datetime2 в 2005 году еще не существовало.
А если вы взялись совершенствовать столь древний скрипт, то как у вас то обстоят дела сос криптованием _всех_ существующих на данный момент типов данных ?
24 апр 15, 14:46    [17559390]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
Crimean
Member

Откуда:
Сообщений: 13147
vooo
Нужен именно скрипт ?
A bcp [out/in] не подойдут ?


+1

причем не в целевую табличку, а рядом, во времянку. а дальше - переноси что и как хочешь. очень рекомендую
24 апр 15, 14:47    [17559396]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
SQLDrakon
Member

Откуда:
Сообщений: 4
Crimean,

у меня сейчас стояла именно такая задача.
Содержимое таблицы в скрипт вида INSERT INTO.
У меня до этого был свой самописный скрипт, но давний и глючный.
Поискал, нашел вот этот. Доработал по своим задачам (да, может, какие-то другие типы полей тоже не будут на нём отрабатывать, но это уже предлагается каждому допилить под себя, если понадобится. Где допиливать - понятно по разнице моего и предыдущего варианта).
Выложил в надежде, что кому-нибудь тоже окажется полезно.
24 апр 15, 14:51    [17559441]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
Glory
Member

Откуда:
Сообщений: 104751
SQLDrakon
но это уже предлагается каждому допилить под себя, если понадобится

Чтобы еще кто-нибудь опять через 10 лет "освежил" эту тему очередным недопиленным скриптом ?
24 апр 15, 14:57    [17559503]     Ответить | Цитировать Сообщить модератору
 Re: содержимое таблицы в скрипт  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4901
+
SQLDrakon
ura, спасибо, скрипт годный.
Однако, попробовав его у себя, обнаружил некоторые недоработки.
В частности, не работает, если поля типа uniqueidentifier и datetime2
Я его немножко "допилил", вот окончательный вариант (и это в варианте обычного скрипта, а не процедуры, мне так удобнее пользоваться, можно запускать в любом месте).

declare @TBL_NM sysname = 'Table1'
,@NEW_TBL_NM sysname = NULL
,@WHERE varchar(4000) = 'Field1=5'
,@ORDER varchar(4000) = 'Field2'
,@IDENTITY_INSERT bit = 0
,@TBL_ID int
,@COL_S varchar(8000)
,@COL_S2 varchar(8000)
,@COL_S3 varchar(8000)

set nocount on

if @NEW_TBL_NM is not NULL
	set @TBL_NM=@NEW_TBL_NM

if @WHERE is not NULL set @WHERE=' where '+@WHERE
else set @WHERE=''
if @ORDER is not NULL set @ORDER=' order by '+@ORDER
else set @ORDER=''

IF EXISTS(SELECT 1 FROM tempdb.dbo.sysobjects WHERE name = '##C') DROP TABLE ##C -- дропаем временную табличку, если есть

create table ##C
(
 col_nm sysname
,col_str varchar(1000)
)

select @TBL_ID=OBJECT_ID(@TBL_NM)

insert into ##C(col_nm,col_str)
select name,'IsNull(REPLACE(CONVERT(varchar(8000),'
		+case when c.xtype in (175,61,239,99,231,58,98,231,35,36,167,42) then '''''''''+' else '' end
		+case when c.xtype in (36,42) then 'cast(' else '' end
		+name
		+case when c.xtype in (36,42) then ' as varchar(36))' else '' end
		+case when c.xtype in (175,61,239,99,231,58,98,231,35,36,167,42) then '+''''''''' else '' end
		+'),'''''''''''',''''''''''''''''),''NULL'')'
from syscolumns c
where id=@TBL_ID and (@IDENTITY_INSERT=1 or status&0x80=0) and name<>'rowguid'

set @COL_S=''
set @COL_S2=''
set @COL_S3=''
select @COL_S=@COL_S+col_nm+','
	,@COL_S2=@COL_S2+col_str+'+'',''+'
	,@COL_S3=@COL_S3+'NULL,'
from ##C

set @COL_S=LEFT(@COL_S,Len(@COL_S)-1)
set @COL_S2=LEFT(@COL_S2,Len(@COL_S2)-5)
set @COL_S3=LEFT(@COL_S3,Len(@COL_S3)-1)

if @IDENTITY_INSERT=1 select 'SET IDENTITY_INSERT '+@TBL_NM+' ON'

select 'begin tran'

exec (
'select ''
if @@ERR<>0 goto rlbk
insert into ['+@TBL_NM+'] ('+@COL_S+')
select ''+'+@COL_S2+
' from '+@TBL_NM+@WHERE+@ORDER
)

select '
if @@ERR<>0 goto rlbk
commit tran
rlbk:'
if @IDENTITY_INSERT=1 select 'SET IDENTITY_INSERT '+@TBL_NM+' OFF'
select 'if @@TRANCOUNT<>0 rollback tran
'+'GO
'
GO



ЧУДО!!!! Этот скрипт успешно отработал на InMemory таблице!!!!
24 апр 15, 16:14    [17560031]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить