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

Откуда:
Сообщений: 1699
Уважаемый форум!
Мучился 3 года назад и сейчас мучаюсь каким-то элементарным вопросом. Может быть его возникновение говорит о моей полной несостоятельности, с печалью признАю это, но может есть не зависящая от меня заковыка? Может в настройках Студии что-то надо поменять?
При отладке текста триггера оператор Print выдает в экран сообщений значения числовых переменных, но упорно ни в каком виде не хочет выводить символьные строки.
Вот синтезировал я динамически строку @SQL varchar(1000), ставлю Print @SQL, а мне в ответ - пустая строка...
При этом суслик есть и даже исполняется (правда с ошибками - но их-то я и хочу отладить, посмотрев на код).

Что это?

Заранее благодарен.
21 июн 13, 14:00    [14465748]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
Glory
Member

Откуда:
Сообщений: 104751
Лифчик
Вот синтезировал я динамически строку @SQL varchar(1000), ставлю Print @SQL, а мне в ответ - пустая строка...

Наверное потому, что строка и есть пустая
21 июн 13, 14:03    [14465772]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
aleks2
Guest
пользуй
raiserror('тра-ля-ля', 0, 1) with nowait;
21 июн 13, 14:03    [14465775]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
Лифчик
Member

Откуда:
Сообщений: 1699
Glory
Лифчик
Вот синтезировал я динамически строку @SQL varchar(1000), ставлю Print @SQL, а мне в ответ - пустая строка...

Наверное потому, что строка и есть пустая
Exec(@SQL) так не считает...
21 июн 13, 14:11    [14465839]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
Glory
Member

Откуда:
Сообщений: 104751
Лифчик
Exec(@SQL) так не считает...

Exec севершенно спокойно относится к NULL строке

declare @x varchar(1000)
print @x
exec(@x)
21 июн 13, 14:13    [14465857]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2414
select @SQL ?
21 июн 13, 14:22    [14465913]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
super-code
Member

Откуда:
Сообщений: 244
Лифчик,

попробуй
print N'test1'
print 'test2'

Тоже пустая строка?
21 июн 13, 14:34    [14466038]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
Лифчик
Member

Откуда:
Сообщений: 1699
Glory
Лифчик
Exec(@SQL) так не считает...

Exec севершенно спокойно относится к NULL строке

declare @x varchar(1000)
print @x
exec(@x)
Текст триггера (ветка Insert)
ALTER TRIGGER [Persons_UID]
   ON  [dbo].[Persons]
   FOR INSERT,DELETE,UPDATE
AS 
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
Declare @TableName varchar(128)
Declare @SQL varchar(1000)
Declare @Date datetime
Declare @Datetxt varchar(100)
Declare @Oid int
Declare @Fld varchar(128)
set @Oid=@@ProcID
set @TableName = (select [Name] from sys.tables where object_id=@Oid)
set @Fld=(select [Name] from sys.identity_columns where object_id=@Oid)
set @Date=getdate()
set @Datetxt=Convert(varchar(100),@Date,126)
if (not exists(select * from deleted)) and (not exists(select * from inserted))
return
    if not exists(select * from deleted)
    begin
    insert into Journal (id_action, id_table, date_action, jdata) select 0,@Oid,@Date,(select * from inserted for xml path(''), type) from inserted
select * into #inserted from inserted
set @SQL='update '+@TableName+' set TStamp='+@Datetxt+' from '+@TableName+
' INNER JOIN '+@TableName+'.'+@Fld+'=#inserted.'+@Fld
print 'Hello'
print @Oid
print @TableName
print @SQL
Raiserror(@SQL,0,1) with nowait
Exec(@SQL)
	end
END

Последующий запрос
insert into Persons(FilialID,FIO) values(450,'Desk555')

Результат
Hello
821577965
 
 
 

(строк обработано: 1)
21 июн 13, 14:46    [14466158]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
Glory
Member

Откуда:
Сообщений: 104751
Ну так @TableName получился NULL и поэтому @SQL тоже NULL
21 июн 13, 14:49    [14466195]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
Glory
Member

Откуда:
Сообщений: 104751
print ISNULL(@TableName, 'Epic fail')
print ISNULL(@SQL, 'Epic fail2')
print ISNULL(@Fld, 'Epic fail3')
21 июн 13, 14:54    [14466230]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Это что за чудо такое?
Лифчик
' INNER JOIN '+@TableName+'.'+@Fld+'=#inserted.'+@Fld
Вам print не поможет.
21 июн 13, 14:55    [14466247]     Ответить | Цитировать Сообщить модератору
 Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Лифчик,

кроме всего прочего:
  • все строки для скрипта должны быть юникодными (иначе они преобразуются неявно, а это плохо),
  • для названий объектов БД есть специальный тип sysname,
  • их хорошо бы помещать в функцию QUOTENAME, потому что в общем случае они могут содержать квадратные скобки.
  • EXEC() ожидает тип аргумента NVARCHAR(MAX)
  • 21 июн 13, 15:09    [14466359]     Ответить | Цитировать Сообщить модератору
     Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Интересно, а вот этим
    set @Oid=@@ProcID
    set @TableName = (select [Name] from sys.tables where object_id=@Oid)

    вы имя какой таблицы собирались получить ?
    21 июн 13, 15:13    [14466391]     Ответить | Цитировать Сообщить модератору
     Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
    aleks2
    Guest
    Фсе равно raiserror лучче

    declare @x varchar(1000)
    print @x
    exec(@x)
    raiserror('@x = %s', 0, 1, @x) with nowait
    
    21 июн 13, 15:14    [14466398]     Ответить | Цитировать Сообщить модератору
     Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
    aleks2
    Guest
    Правда, аффтор топика не умеет его готовить...
    21 июн 13, 15:15    [14466409]     Ответить | Цитировать Сообщить модератору
     Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
    Лифчик
    Member

    Откуда:
    Сообщений: 1699
    Glory
    Интересно, а вот этим
    set @Oid=@@ProcID
    set @TableName = (select [Name] from sys.tables where object_id=@Oid)

    вы имя какой таблицы собирались получить ?
    Спасибо! Проблему топика вы как всегда помогли эффективно решить.
    Теперь вот не подскажете ли, как правильно подставить в эту SQL-строку значение @Date. Напрямую ругается на преобразование из даты в строку. Я пытался делать через @Datetxt, но там тоже сплошные заморочки.
    ALTER TRIGGER [Persons_UID]
       ON  [dbo].[Persons]
       FOR INSERT,DELETE,UPDATE
    AS 
    BEGIN
    	-- SET NOCOUNT ON added to prevent extra result sets from
    	-- interfering with SELECT statements.
    	SET NOCOUNT ON;
    Declare @TableName varchar(128)
    Declare @SQL varchar(1000)
    Declare @Date datetime
    Declare @Datetxt varchar(100)
    Declare @Oid int
    Declare @Fld varchar(128)
    set @Oid=(select Parent_object_id from sys.objects where object_id=@@ProcID)
    set @TableName = (select [Name] from sys.tables where object_id=@Oid)
    set @Fld=(select [Name] from sys.identity_columns where object_id=@Oid)
    set @Date=getdate()
    set @Datetxt=Convert(varchar(100),@Date,126)
    if (not exists(select * from deleted)) and (not exists(select * from inserted))
    return
        if not exists(select * from deleted)
        begin
        insert into Journal (id_action, id_table, date_action, jdata) select 0,@Oid,@Date,(select * from inserted for xml path(''), type) from inserted
    select * into #inserted from inserted
    set @SQL='update '+@TableName+' set TStamp='+@Date+' from '+@TableName+
    ' INNER JOIN '+@TableName+'.'+@Fld+'=#inserted.'+@Fld
    print @SQL
    Exec(@SQL)
    	end
    END
    

    to iap
    Спасибо за советы - потом дошлифую, но вот sysnames я у себя не нашел почему-то...Поэтому беру где доступно
    21 июн 13, 15:58    [14466766]     Ответить | Цитировать Сообщить модератору
     Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Лифчик
    апрямую ругается на преобразование из даты в строку.

    Потому что тип данных datetime имеет больший приоритет и вся остальная строка преобразоваватся к этому типу
    Лифчик
    Я пытался делать через @Datetxt, но там тоже сплошные заморочки.

    Придется их обойти и преоразовать дату в строку

    ЗЫ
    А зачем тут динамический запрос ? Вы очередной изобретатель универсального триггера ?
    21 июн 13, 16:29    [14467000]     Ответить | Цитировать Сообщить модератору
     Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
    Лифчик
    Member

    Откуда:
    Сообщений: 1699
    Glory
    ЗЫ
    А зачем тут динамический запрос ? Вы очередной изобретатель универсального триггера ?
    Видимо да, но я скромный, универсальность очень ограничена - исключительно для собственного удобства, на патенты не претендую:)
    21 июн 13, 16:34    [14467019]     Ответить | Цитировать Сообщить модератору
     Re: Серверстудия 2005 - Print не выводит символьные переменные  [new]
    Glory
    Member

    Откуда:
    Сообщений: 104751
    Лифчик
    Glory
    ЗЫ
    А зачем тут динамический запрос ? Вы очередной изобретатель универсального триггера ?
    Видимо да, но я скромный, универсальность очень ограничена - исключительно для собственного удобства, на патенты не претендую:)

    Дело не в патентах, а в том, что универсальный триггер нечто подобное вечному двигателю.
    Многие хотят его изобрести, но пока ни у кого не получилось.
    21 июн 13, 16:38    [14467059]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить