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

Откуда: Москва
Сообщений: 132
Задача: надо перебрать все поля записи и закинуть их значение в переменную sql_variant
Пробовал так:
	DECLARE @TblName	VARCHAR(128)
	DECLARE @ColName	VARCHAR(128)
	DECLARE @Value		SQL_VARIANT
	
	SELECT @TblName = 'tblTRSPEC'
	
	-- курсор по столбцам таблицы
	DECLARE ColNames CURSOR FOR
	SELECT 
			column_name=syscolumns.name
             FROM 
			sysobjects 
			JOIN 
			syscolumns ON sysobjects.id = syscolumns.id
			JOIN 
			systypes ON syscolumns.xtype=systypes.xtype
	WHERE 
			sysobjects.xtype='U' AND
			sysobjects.name=@TblName
	ORDER BY 
			sysobjects.name,syscolumns.colid
	
	
	OPEN ColNames
	FETCH NEXT FROM ColNames INTO @ColName
	WHILE @@FETCH_STATUS = 0
	BEGIN


		EXEC('SELECT @Value='+@ColName+' FROM tblTRSpec where id='+@id) 

		print @ColName+'='+convert(varchar,@value)

		FETCH NEXT FROM ColNames INTO @ColName
	END

DEALLOCATE ColNames
Результат: Вылетает с сообщением -
MSSQL
Must declare the scalar variable "@Value".

Т.е. внутри EXEC он не видит переменную @Value.

Как это обойти?
29 июн 09, 16:49    [7355593]     Ответить | Цитировать Сообщить модератору
 Re: Как получить содержимое всех полей записи по очереди если структура таблицы не известна?  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18323
Сейчас тебя отправят в фак)
29 июн 09, 16:54    [7355610]     Ответить | Цитировать Сообщить модератору
 Re: Как получить содержимое всех полей записи по очереди если структура таблицы не известна?  [new]
jsmirnoww
Member

Откуда: Москва
Сообщений: 132
Отправьте, только с конкретной ссылкой, плз
29 июн 09, 16:58    [7355634]     Ответить | Цитировать Сообщить модератору
 Re: Как получить содержимое всех полей записи по очереди если структура таблицы не известна?  [new]
jsmirnoww
Member

Откуда: Москва
Сообщений: 132
Вопрос в догонку:
Как в триггере можно использовать таблицу INSERTED в функции EXEC
вот так не получается :(
EXEC('SELECT '''+@TblName+''','''+@ColName+''','+@ColName+' FROM INSERTED')
29 июн 09, 17:19    [7355697]     Ответить | Цитировать Сообщить модератору
 Re: Как получить содержимое всех полей записи по очереди если структура таблицы не известна?  [new]
_djХомяГ
Guest
1 faq


более искусственные и не красивые способы:
2
use pubs
go
declare @sql varchar(5000)
set @sql='
declare @title   varchar(200)
select @title=title from titles where title_id=''BU1032''
select @title
'
exec(@sql)

3
use pubs
go
create table #tmp(title varchar(50))
declare @title   varchar(200)
declare @sql varchar(5000)
set @sql='
insert into #tmp(title)
select title from titles where title_id=''BU1032'''
exec(@sql)
select * from #tmp
select @title=title from #tmp
select @title
29 июн 09, 17:23    [7355711]     Ответить | Цитировать Сообщить модератору
 Re: Как получить содержимое всех полей записи по очереди если структура таблицы не известна?  [new]
Deff
Member

Откуда: Пермь
Сообщений: 18323
jsmirnoww
Вопрос в догонку:
Как в триггере можно использовать таблицу INSERTED в функции EXEC
вот так не получается :(
EXEC('SELECT '''+@TblName+''','''+@ColName+''','+@ColName+' FROM INSERTED')


Это ты уже совсем загнул. Через временную таблицу только.

Динамический запрос. sp_executesql
29 июн 09, 17:23    [7355712]     Ответить | Цитировать Сообщить модератору
 Re: Как получить содержимое всех полей записи по очереди если структура таблицы не известна?  [new]
Glory
Member

Откуда:
Сообщений: 104760
jsmirnoww
Вопрос в догонку:
Как в триггере можно использовать таблицу INSERTED в функции EXEC

Не пишите универсальный триггер. Напишите генератор триггеров
29 июн 09, 17:29    [7355730]     Ответить | Цитировать Сообщить модератору
 Re: Как получить содержимое всех полей записи по очереди если структура таблицы не известна?  [new]
jsmirnoww
Member

Откуда: Москва
Сообщений: 132
Glory
jsmirnoww
Вопрос в догонку:
Как в триггере можно использовать таблицу INSERTED в функции EXEC

Не пишите универсальный триггер. Напишите генератор триггеров

Это что такое? подкиньте ссылочку почитать
29 июн 09, 17:34    [7355743]     Ответить | Цитировать Сообщить модератору
 Re: Как получить содержимое всех полей записи по очереди если структура таблицы не известна?  [new]
Glory
Member

Откуда:
Сообщений: 104760
jsmirnoww
Glory
jsmirnoww
Вопрос в догонку:
Как в триггере можно использовать таблицу INSERTED в функции EXEC

Не пишите универсальный триггер. Напишите генератор триггеров

Это что такое? подкиньте ссылочку почитать

Это написанный вами скрипт, который по заданному имени таблицы создаст триггер, в котором не будет динамических запросов, SQL_VARIANT-ов и прочих прелестей универсального триггера. А все поля и переменные будут прописаны явно с соответствующими типами данных
29 июн 09, 17:35    [7355746]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить