Имя: Пароль:
IT
 
как в SQL написать цикл по таблице или выгрузить базу ?
0 nop
 
модератор
29.03.11
11:38
по мотивам:
Как сделать JOIN для таблиц из разных БД ?
Как сграбить запрос к MS SQL 2000 ?
Помогите изучить СУБД сторонней программы на MS SQL 2000

Хочу сделать нечто вроде

FOR EACH SO FROM SYSOBJECTS DO
 EXEC xp_cmdshell 'bcp "SELECT * from SO.name" queryout E:\fired_reports\SO.Name.txt -c -C1251 -T'


то есть выгрузить данный каждой таблицы в одноименный txt
1 Господин ПЖ
 
29.03.11
11:39
открой для себя курсоры...
2 vde69
 
29.03.11
11:40
XP рулит, создай, выполни, удали
3 shuhard
 
29.03.11
11:41
(1) или DTS
4 Господин ПЖ
 
29.03.11
11:42
declare @name varchar(128)

declare cur_doc cursor for select name from sysobjects where xtype = 'v' and name like 'Документ_%'order by name
open cur_doc
fetch cur_doc into @name
while @@fetch_status = 0
begin    

exec ('delete from '+@name+' where ...)

end
close cur_doc
deallocate cur_doc
5 nop
 
модератор
29.03.11
11:49
(4) спасибо, только не delete и это не 1с :)
6 sapphire
 
29.03.11
11:53
см. sp_msforeachtable
7 Ёпрст
 
гуру
29.03.11
11:54
8 nop
 
29.03.11
11:56
блин, скоко способов, спасибо. Начал пробовать (4)
9 sapphire
 
29.03.11
11:56
(4) так проще :D
exec sp_msforeachtable 'truncate table ?'
10 nop
 
29.03.11
11:58
(9) не, мне delete больше нравится. Только с xtype = 'u', а то с v нету ни одной
11 nop
 
29.03.11
12:03
Нормально будет?
Для любителей пошутить с delete и т.п., говорю заранее, что делать буду на рабочей базе, останавливать и делать копию возможности нет.

---------------------------------------
declare @name varchar(128)

declare cur_doc cursor for select name from sysobjects where xtype = 'u' order by name
open cur_doc
fetch cur_doc into @name
while @@fetch_status = 0
begin    

exec xp_cmdshell 'bcp "SELECT * from '+@name+'" queryout C:\fired_reports\SO.Name.txt -c -C1251 -T'

end
close cur_doc
deallocate cur_doc
12 МихаилМ
 
29.03.11
12:06
курсоры заменяте функциями.
13 ДенисЧ
 
29.03.11
12:07
(11) если отдельная команда выполняется, то в общем - правильно
14 nop
 
29.03.11
12:13
(13) не выполняется
exec ('xp_cmdshell bcp "SELECT * FROM APPLICATION_SETTINGS" queryout C:\fired_reports\APPLICATION_SETTINGS.txt -c -C1251 -T')


Descr=Line 1: Incorrect syntax near 'SELECT * from APPLICATION_SETTINGS'.
SQLState=42000
Number=-2147217900
Native Error=170
15 nop
 
29.03.11
12:14
а, ваще прекрасно, процедуры xp_cmdshell ещё нет
16 упс
 
29.03.11
12:30
17 nop
 
29.03.11
12:37
Descr=The configuration option 'xp_cmdshell' does not exist, or it may be an advanced option
18 nop
 
29.03.11
12:42
так тоже самое получаю

USE master
GO
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE WITH OVERRIDE
GO
EXEC sp_configure 'show advanced options', 0
GO
19 nop
 
29.03.11
12:50
може проще xp_cmdshell самому добавить к БД master, если код найти
20 nop
 
29.03.11
12:53
такой подойдет?
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=740&lngWId=5
               
--**************************************
-- Name: Custom xp_cmdshell
-- Description:Custom xp_cmdshell
-- By: OddityX
--
--This code is copyrighted and has-- limited warranties.Please see http://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=740&lngWId=5--for details.--**************************************

CREATE PROCEDURE xp_cmdshell(cmd varchar(255), @Wait int = 0) AS
--Create WScript.Shell object
DECLARE @result int, @OLEResult int, @RunResult int
DECLARE @ShellID int
EXECUTE @OLEResult = sp_OACreate 'WScript.Shell', @ShellID OUT
IF @OLEResult <> 0 SELECT @result = @OLEResult
IF @OLEResult <> 0 RAISERROR ('CreateObject %0X', 14, 1, @OLEResult)
EXECUTE @OLEResult = sp_OAMethod @ShellID, 'Run', Null, cmd, 0, @Wait
IF @OLEResult <> 0 SELECT @result = @OLEResult
IF @OLEResult <> 0 RAISERROR ('Run %0X', 14, 1, @OLEResult)
--If @OLEResult <> 0 EXEC sp_displayoaerrorinfo @ShellID, @OLEResult
EXECUTE @OLEResult = sp_OADestroy @ShellID
return @result
21 sapphire
 
29.03.11
12:57
(19) Коль, ты бы написал, что за ошибка, версия серванта
22 nop
 
29.03.11
13:01
(20) блин, попробовал говорит "уже есть объект xp_cmdshell"

(21) ошибка в (17) MS SQL 2000 MSDE  вроде
23 nop
 
29.03.11
13:13
(22) + и в текстах встроенных процедур вызовы xp_cmdshell встречаются ввиде master..xp_cmdshell, а в списке процедур БД master она не встречается
24 nop
 
29.03.11
13:16
хух, вот это сработало

EXEC sp_configure 'show advanced options', 1
EXEC sp_configure 'xp_cmdshell', 1
RECONFIGURE
GO
EXEC master..xp_cmdshell 'dir *.exe'
25 nop
 
29.03.11
13:23
снова проблемы
exec master..xp_cmdshell 'bcp "SELECT * FROM APPLICATION_SETTINGS" queryout C:\fired_reports\APPLICATION_SETTINGS.txt -c -C1251 -T'

после master.. запрос пытается искать таблицу APPLICATION_SETTINGS в БД master, но её там нет. Таблицы БД мастер выгружаются норм
26 nop
 
29.03.11
13:26
пошло вот так
exec master..xp_cmdshell 'bcp "SELECT * FROM xSQLProfiler.dbo.APPLICATION_SETTINGS" queryout C:\fired_reports\APPLICATION_SETTINGS.txt -c -C1251 -T'
27 nop
 
модератор
29.03.11
15:23
вот такой пакет получился
---------------------------------------------
declare @name varchar(128)
declare @dbname varchar(128)
declare @bcpcommand varchar(256)

declare cur_doc cursor for SELECT NAME FROM sysobjects WHERE xtype = 'u' order by name desc

set @dbname = DB_NAME(@@PROCID)
open cur_doc
fetch cur_doc into @name
while @@fetch_status = 0 begin
   set @bcpcommand = 'bcp "SELECT * FROM '+@dbname+'.dbo.'+@name+'" queryout "C:\fired_reports\'+@name+'.txt" -c -C1251 -T';
   exec master..xp_cmdshell @bcpcommand
   fetch cur_doc into @name
end
close cur_doc
deallocate cur_doc
28 nop
 
модератор
29.03.11
15:23
всем спасибо
29 nop
 
29.03.11
15:29
чего то кодировка кривая :(
30 nop
 
29.03.11
16:09
хочу разбить комп уже!!1 Что с кодировкой ?
31 ДенисЧ
 
29.03.11
16:10
Кто ж тебя знает, что там у тебя с кодировкой...
32 nop
 
29.03.11
16:15
параметр кодировки -CRAW помог
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший