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

Откуда: Москва, прости Господи...
Сообщений: 192
?
собственно сабж)))
5 фев 15, 13:28    [17222295]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37068
sp_msforeachdb
5 фев 15, 13:30    [17222306]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
експерты однако нынче пошли
5 фев 15, 13:33    [17222335]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
prog2012
Member

Откуда: Москва, прости Господи...
Сообщений: 192
Maxx
експерты однако нынче пошли

не мы такие - 1С такая )))
5 фев 15, 13:35    [17222350]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
prog2012
Member

Откуда: Москва, прости Господи...
Сообщений: 192
Сообщение 103, уровень 15, состояние 4, строка 1
идентификатор, который начинается с "

мой код

", - слишком длинный. Максимальная длина составляет 128.

и что делать?
курсор?
5 фев 15, 14:01    [17222551]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
Konst_One
Member

Откуда:
Сообщений: 11538
["]
5 фев 15, 14:02    [17222560]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
Glory
Member

Откуда:
Сообщений: 104760
prog2012
и что делать?
курсор?

sp_msforeachdb как раз его и использует
5 фев 15, 14:11    [17222625]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
prog2012
Member

Откуда: Москва, прости Господи...
Сообщений: 192
Konst_One
["]

это смайл или элементы ситаксиса? ))
5 фев 15, 14:15    [17222653]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
prog2012
Member

Откуда: Москва, прости Господи...
Сообщений: 192
Glory
prog2012
и что делать?
курсор?

sp_msforeachdb как раз его и использует

так вот короткие команды проходят а моя выдает ошибку
5 фев 15, 14:16    [17222658]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
Glory
Member

Откуда:
Сообщений: 104760
prog2012
это смайл или элементы ситаксиса?

Это укороченная версия ответа на ваше укороченное описание ошибки
5 фев 15, 14:16    [17222662]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
prog2012
Member

Откуда: Москва, прости Господи...
Сообщений: 192
Glory
prog2012
это смайл или элементы ситаксиса?

Это укороченная версия ответа на ваше укороченное описание ошибки

я там всё скопипастил только свой код заменил на "мой код"
5 фев 15, 14:19    [17222680]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
Glory
Member

Откуда:
Сообщений: 104760
prog2012
я там всё скопипастил только свой код заменил на "мой код"

Т.е. нужно угадать, что и как вы вызвали ?
5 фев 15, 14:20    [17222693]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
prog2012
Member

Откуда: Москва, прости Господи...
Сообщений: 192
Glory
prog2012
я там всё скопипастил только свой код заменил на "мой код"

Т.е. нужно угадать, что и как вы вызвали ?


exec sp_MSforeachdb @command1 = "

Print 'dhfghfgsdfgdsghgdfgfhkadklgasjhklfghdklsjfgklsdjfk
dhfghfgsdfgdsghgdfgfhkadklgasjhklfghdklsjfgklsdjfk';


Print 'dhfghfgsdfgdsghgdfgfhkadklgasjhklfghdklsjfgklsdjfk
dhfghfgsdfgdsghgdfgfhkadklgasjhklfghdklsjfgklsdjfk';


"

например. каждый кусок отдельно исполняется
вместе пишет

Сообщение 103, уровень 15, состояние 4, строка 1
идентификатор, который начинается с "

Print 'dhfghfgsdfgdsghgdfgfhkadklgasjhklfghdklsjfgklsdjfk
dhfghfgsdfgdsghgdfgfhkadklgasjhklfghdklsjfgklsdjfk';


Print '", - слишком длинный. Максимальная длина составляет 128.
5 фев 15, 14:38    [17222835]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
Glory
Member

Откуда:
Сообщений: 104760
А то, что строковые параметры процедуры нужно в двойные кавычки брать вы сами решили или подсказал кто ?
5 фев 15, 14:40    [17222857]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
prog2012
Сообщение 103, уровень 15, состояние 4, строка 1
идентификатор, который начинается с "

мой код

", - слишком длинный. Максимальная длина составляет 128.

и что делать?
Заметьте - идентификатор слишком длинный.
То есть имя, которое вы выбрали для объекта, превышает 128 символов (зачем такое длинное?)
Правильно читайте сообщения об ошибках.

А параметр у sp_msforeachdb имеет тип nvarchar(2000), т.е. до 2000 символов, не так уж мало.

Котрче, просто кривой код (начинается с ", а внутри, наоборот, одинарные кавычки не удвоены).
5 фев 15, 15:02    [17223049]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
prog2012
Member

Откуда: Москва, прости Господи...
Сообщений: 192
alexeyvg,

exec sp_MSforeachdb @command1 = 'PRINT ''Listing *''', @replacechar = '*', @command2 ='USE *; INSERT pubs..temp1 SELECT DB_NAME()', @precommand = 'if exists (select * from dbo.sysobjects where id = object_id(N''pubs..temp1'') and OBJECTPROPERTY(id, N''IsUserTable'') = 1) DROP TABLE pubs..temp1 CREATE TABLE pubs..temp1(dbname varchar(50))', @postcommand = 'SELECT * FROM pubs..temp1'

https://www.sql.ru/articles/mssql/02030101undocumentedsql.shtml

показалось что двойные стоят )))
5 фев 15, 16:03    [17223570]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
o-o
Guest
alexeyvg
Заметьте - идентификатор слишком длинный.
То есть имя, которое вы выбрали для объекта, превышает 128 символов (зачем такое длинное?)
Правильно читайте сообщения об ошибках.

да ему как выдалось сообщение, так он и прочел.
вы сами попробуйте выполнить:
exec sp_MSforeachdb @command1 = "Print 'dhf';";
exec sp_MSforeachdb @command1 = 'Print ''dhf'';';

оба раза печатается запрошенное. ровно столько раз, сколько баз

а теперь:
exec sp_MSforeachdb @command1 = "Print 'dhfsdgsgkfdfhgjdkfgfgfgjhfhjfgdhfg
fdkfhdfdkjfgkdjfgsdkjfgkjfgfgklfgkfgklfgklfgsdkfgsdlkfgskdlfgjksdfksdkfsdgjkf
fgdjkgfdsjgfsdjgfjsgafjgsdfgsadjfgdkjsgfjskdgfjsdhfjdhfjhdjhfjhdjhfjhdjdhddddf';";

exec sp_MSforeachdb @command1 = 'Print ''dhfsdgsgkfdfhgjdkfgfgfgjhfhjfgdhfg
fdkfhdfdkjfgkdjfgsdkjfgkjfgfgklfgkfgklfgklfgsdkfgsdlkfgskdlfgjksdfksdkfsdgjkf
fgdjkgfdsjgfsdjgfjsgafjgsdfgsadjfgdkjsgfjskdgfjsdhfjdhfjhdjhfjhdjhfjhdjdhddddf'';';

первый вариант выдаст
Msg 103, Level 15, State 4, Line 1
The identifier that starts with 'Print 'dhfsdgsgkfdfhgjdkfgfgfgjhfhjfgdhfg
fdkfhdfdkjfgkdjfgsdkjfgkjfgfgklfgkfgklfgklfgsdkfgsdlkfgskdlfgjksdfksdkfsdgjkf
fgdjkg' is too long. Maximum length is 128.


а второй отработает, как положено
мораль:
Glory
А то, что строковые параметры процедуры нужно в двойные кавычки брать вы сами решили или подсказал кто ?
5 фев 15, 16:04    [17223575]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
prog2012
Member

Откуда: Москва, прости Господи...
Сообщений: 192
короче что-то заработало после множественного добавления вторых верхних апосрофов в процедуре
как бы теперь так сделать чтобы их не добавлять
может хранимку как-то через этот форреачтабл вызвать?
5 фев 15, 16:04    [17223578]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
o-o
да ему как выдалось сообщение, так он и прочел.
Да я понимаю. Просто слово идентификатор и должно натолкнуть на мысль, что дело не в слишком длинной строке выполнения...
prog2012
короче что-то заработало после множественного добавления вторых верхних апосрофов в процедуре
как бы теперь так сделать чтобы их не добавлять
может хранимку как-то через этот форреачтабл вызвать?
Естественно, если внутри строки в одинарных кавычках будут ещё одинарные кавычки, сервер не поймёт, где там строка.

По моему, проще задублировать кавычки, чем возиться с процедурами :-)
5 фев 15, 19:01    [17224758]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
o-o
Guest
alexeyvg
o-o
да ему как выдалось сообщение, так он и прочел.
Да я понимаю. Просто слово идентификатор и должно натолкнуть на мысль, что дело не в слишком длинной строке выполнения...

ну, может вы так выражаетесь...
я, читая вот такое
alexeyvg
То есть имя, которое вы выбрали для объекта, превышает 128 символов (зачем такое длинное?)
Правильно читайте сообщения об ошибках.

понимаю, что мне намекают, что зачем-то я где-то даю длинные имена :)
да еще и что читать не умею.
т.е. в данном случае лучше б мне дали под зад фразой о двойных кавычках
5 фев 15, 19:15    [17224810]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
o-o
т.е. в данном случае лучше б мне дали под зад фразой о двойных кавычках
Ищите лёгких путей! :-)
5 фев 15, 19:20    [17224836]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
alexeyvg
o-o
т.е. в данном случае лучше б мне дали под зад фразой о двойных кавычках
Ищите лёгких путей! :-)
Я просто хотел, что бы ТС в будущем читал сообщения об ошибках, и задумывался над ними. Человек должен понять, что же ему сервер пишет, не воспринимал любой красненький текст кратко "АШИПКА".
Можно и тут спросить про непонятные слова. Написал бы здесь - "почему мне пишет про идентификаторы, у меня же названия объектов не больше 20 символов" - было бы +100 к программистской карме, а так +100 к блондинке.
5 фев 15, 19:25    [17224861]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
o-o
Guest
alexeyvg
o-o
т.е. в данном случае лучше б мне дали под зад фразой о двойных кавычках
Ищите лёгких путей! :-)

а вот и нет :)
мне-то как раз стало интересно, почему это парсер решил, что это идентификатор.
вещь недокументированная, приходится догадываться.
похоже, в качестве первого параметра можно подставлять идентификатор, т.е. нечто типа SYSNAME,
к-ое может исполняться, т.е. имя процедуры.
создаю для проверки процедуру вида
create proc sp_select1
as select 1;


и проверяю, проканается ли
exec sp_MSforeachdb sp_select1

да, отработало.
-> вроде правдоподобно.
но это я сейчас рассуждаю.
а порой некогда философствовать, надо срочно решить,
а обдумать, вероятно, удастся чуть позже уже в более спокойной обстановке.
и вот в такой ситуации более "времясохраняющим" является пусть даже и пинок,
но в нужную сторону, а не мирное наставление, уводящее в лес раздумий :)
*IMHO*
5 фев 15, 22:54    [17225491]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
invm
Member

Откуда: Москва
Сообщений: 9405
o-o
похоже, в качестве первого параметра можно подставлять идентификатор, т.е. нечто типа SYSNAME,
к-ое может исполняться, т.е. имя процедуры.
Нет. Дело в правилах выполнения пакета:
https://msdn.microsoft.com/en-us/library/ms175502(v=sql.105)
If an EXECUTE statement is the first statement in a batch, the EXECUTE keyword is not required. The EXECUTE keyword is required if the EXECUTE statement is not the first statement in the batch.
5 фев 15, 23:16    [17225555]     Ответить | Цитировать Сообщить модератору
 Re: код в контексте базы, как его выполнить для всех не системных баз?  [new]
o-o
Guest
invm,

с приведенной вами цитатой соглашусь, и перед именем процедуры можно опустить EXEC.
но ведь не выполнится:
exec sp_MSforeachdb exec sp_select1

это будет синтаксически неверным.

в то же время выполнится:
exec sp_MSforeachdb sp_select1

т.е. в кач-ве первого параметра идет или строка, или имя процедуры.
или объясните, пожалуйста, подробнее
6 фев 15, 00:56    [17225868]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить