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

Откуда:
Сообщений: 356
Здравствуйте
Делаю следующий код:
declare @str varchar(8000),@i int,@cc int

select @cc=500

while @i<=@cc
	begin
	select @str=@str+',st'+convert(varchar(300),@i)+' float'
	select @i=@i+1
	end

select @str='create table #rt (vcm int,marka varchar(300),nomen int,memcode varchar(300),reg_name varchar(300)'
		   +@str+')'

exec (@str)

select * from #rt


И он выдаёт мне ошибку, грит нету у тебя такой таблицы как #rt, хотя Exec проходит нормально
8 апр 15, 12:18    [17487679]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
И он выдаёт мне ошибку, грит нету у тебя такой таблицы как #rt, хотя Exec проходит нормально

Он все правильно говрит. И делает так, как в документации написано

Сообщение было отредактировано: 8 апр 15, 12:22
8 апр 15, 12:21    [17487695]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
declare @str varchar(8000),@i int,@cc int
select @cc=500,@i=0
while @i<=@cc	
begin	
select @str = isnull(@str+',','') + 'st'+convert(varchar(300),@i)+' float'	
select @i=@i+1	
end

if OBJECT_ID('tempdb..#rt') is not null drop table #rt
create table #rt (vcm int,marka varchar(300),nomen int,memcode varchar(300),reg_name varchar(300))

select @str='alter table #rt add '+ +@str 
exec (@str)

select * from #rt
8 апр 15, 12:28    [17487736]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
R-Magistr
Member

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

Здравствуйте, Глория ))))

Вопросы, где ж тогда он создаёт мне таблицу?
И как мне её ко мне притащить?
8 апр 15, 12:29    [17487741]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE	@str NVARCHAR(MAX) = '',
		@i INT = 1,
		@cc INT = 500

WHILE @i <= @cc BEGIN

	SELECT 
		  @str = @str + ',st' + CONVERT(VARCHAR(10), @i) + ' float'
		, @i += 1

END

IF OBJECT_ID('tempdb.dbo.##rt') IS NOT NULL
	DROP TABLE #rt

SELECT @str = 'create table ##rt (vcm int,marka varchar(300),nomen int,memcode varchar(300),reg_name varchar(300)' + @str + ')'

EXEC sys.sp_executesql @str

select * from ##rt


Теперь по существу. У Вас не все переменные были проициализированы. Соответственно в цикл мы не заходили. Переменная @str была NULL. Склеивать NULL с текстом по дефолтным настройкам приводит к тому что возвращается NULL.

В реальности таблица даже не создавалась :)
8 апр 15, 12:31    [17487754]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
Вопросы, где ж тогда он создаёт мне таблицу?

На все эти вопросы вы найдете ответы в хелпе. В статье CREATE TABLE
8 апр 15, 12:31    [17487761]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
AlanDenton
DECLARE	@str NVARCHAR(MAX) = '',
		@i INT = 1,
		@cc INT = 500

WHILE @i <= @cc BEGIN

	SELECT 
		  @str = @str + ',st' + CONVERT(VARCHAR(10), @i) + ' float'
		, @i += 1

END

IF OBJECT_ID('tempdb.dbo.##rt') IS NOT NULL
	DROP TABLE #rt

SELECT @str = 'create table ##rt (vcm int,marka varchar(300),nomen int,memcode varchar(300),reg_name varchar(300)' + @str + ')'

EXEC sys.sp_executesql @str

select * from ##rt


Теперь по существу. У Вас не все переменные были проициализированы. Соответственно в цикл мы не заходили. Переменная @str была NULL. Склеивать NULL с текстом по дефолтным настройкам приводит к тому что возвращается NULL.

В реальности таблица даже не создавалась :)



Поправил код, внёс туда
select @str='' ,@i=1


Результат тот же
8 апр 15, 12:37    [17487803]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
Konst_One
Member

Откуда:
Сообщений: 11568
ТС, а зачем вам нужен весь этот цирк с динамикой?
8 апр 15, 12:39    [17487818]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
LexusR
declare @str varchar(8000),@i int,@cc int
select @cc=500,@i=0
while @i<=@cc	
begin	
select @str = isnull(@str+',','') + 'st'+convert(varchar(300),@i)+' float'	
select @i=@i+1	
end

if OBJECT_ID('tempdb..#rt') is not null drop table #rt
create table #rt (vcm int,marka varchar(300),nomen int,memcode varchar(300),reg_name varchar(300))

select @str='alter table #rt add '+ +@str 
exec (@str)

select * from #rt


Выдал

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near 'table'.
8 апр 15, 12:41    [17487833]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Прощу прощение, но результат не тот же.

@LexusR уже дал Вам хорошие вариант для дальнейших действий. В том числе я немного подсказал.

В чем проблема? ИМХО, все весьма очевидно.
8 апр 15, 12:42    [17487836]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Konst_One
ТС, а зачем вам нужен весь этот цирк с динамикой?


конечное значение цикла, оно же 500, будет переменным, т.е. не известно сколько его там будет, может 1 может 2 может 10 000
8 апр 15, 12:42    [17487839]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
select @str='alter table #rt add '+ STUFF(@str, 1,1, '')
exec (@str)


Вы не постарались вникнуть в суть предложенного.

1. Запятая в столбцах.
2. Не инициализированные переменные.
8 апр 15, 12:44    [17487851]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
конечное значение цикла, оно же 500, будет переменным, т.е. не известно сколько его там будет, может 1 может 2 может 10 000

И что вы будете дальше делать с неизвестным количеством полей ?
10 000 - это смешно.
8 апр 15, 12:48    [17487875]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE	@str VARCHAR(8000) = '',
		@i INT,
		@cc INT

SELECT
	@cc = 500,
	@i = 0

WHILE @i <= @cc BEGIN

	SELECT 
		  @str = @str + ',st' + CONVERT(VARCHAR(10), @i) + ' float'
		, @i += 1

END

IF OBJECT_ID('tempdb..#rt') IS NOT NULL
	DROP TABLE #rt

CREATE TABLE #rt (
	vcm INT,
	marka VARCHAR(300),
	nomen INT,
	memcode VARCHAR(300),
	reg_name VARCHAR(300)
)

SELECT @str = 'alter table #rt add ' + STUFF(@str, 1, 1, '')
EXEC (@str)

SELECT *
FROM #rt


Если Вы скажете, что и это не работает, то тут уже ничего не поможет :)
Просто обратите внимание на различия.
8 апр 15, 12:48    [17487878]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
Konst_One
Member

Откуда:
Сообщений: 11568
R-Magistr
Konst_One
ТС, а зачем вам нужен весь этот цирк с динамикой?


конечное значение цикла, оно же 500, будет переменным, т.е. не известно сколько его там будет, может 1 может 2 может 10 000


так зачем вам этот цикл и зачем такая временная таблица? вы же её как-то хотите использовать, где именно, в неком приложении или прямо в коде ХП?
какую задачу вы решаете?

может её проще решить другим способом
8 апр 15, 12:48    [17487881]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
R-Magistr
Member

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

Большое спасибо и Вам и Лексусу, спасибо большое )))
Глория тебе то же спасибо )))
8 апр 15, 12:52    [17487914]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE	@str VARCHAR(8000) = ''


я бы заменил на

DECLARE	@str VARCHAR(MAX) = ''


если ожидается большое число итераций. Но помните, что у таблицы ограничение на максимальное кол-во столбов. Сколько именно, если честно, не вспомню. Вроде не более 30к при условии что используются разреженные столбцы. А так не более 1024.

Пжл.
8 апр 15, 12:56    [17487949]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
Глория тебе то же спасибо )))

За говнокод не благодоряд.
8 апр 15, 12:57    [17487952]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
R-Magistr
Глория тебе то же спасибо )))

За говнокод не благодоряд.


Ну а как лучше сделать?
Только с примером
8 апр 15, 12:59    [17487970]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
Glory
пропущено...

За говнокод не благодоряд.


Ну а как лучше сделать?
Только с примером

Сделать что ?
Таблицу с неизвестным количеством полей ? Чтобы дальше обрабатывать ее неизвестными способами для получения неизвестного результата ?
8 апр 15, 13:01    [17487978]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
R-Magistr
пропущено...


Ну а как лучше сделать?
Только с примером

Сделать что ?
Таблицу с неизвестным количеством полей ? Чтобы дальше обрабатывать ее неизвестными способами для получения неизвестного результата ?


Ты говоришь говнокод? что ты имеешь ввиду? запихнуть это всё в строку и её выполнить? или что тогда?
8 апр 15, 13:03    [17487987]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
Glory
Member

Откуда:
Сообщений: 104751
R-Magistr
Ты говоришь говнокод? что ты имеешь ввиду? запихнуть это всё в строку и её выполнить? или что тогда?

Весь ваш подход - говнокод.
Для того, чтобы писать код, который сам генерит выполняемый код, нужно хотя бы уметь руками выполняемый код писать.
8 апр 15, 13:06    [17488006]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
iap
Member

Откуда: Москва
Сообщений: 47052
AlanDenton
у таблицы ограничение на максимальное кол-во столбов. Сколько именно, если честно, не вспомню. Вроде не более 30к при условии что используются разреженные столбцы. А так не более 1024.
https://msdn.microsoft.com/ru-ru/library/ms143432.aspx
8 апр 15, 13:07    [17488016]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE
	  @i INT = 1
	, @cc INT = 500
	, @SQL NVARCHAR(MAX)

IF OBJECT_ID('tempdb.dbo.#rt') IS NOT NULL
	DROP TABLE #rt

CREATE TABLE #rt (
	vcm INT,
	marka VARCHAR(300),
	nomen INT,
	memcode VARCHAR(300),
	reg_name VARCHAR(300)
)

SELECT @SQL = 'ALTER TABLE #rt ADD ' + STUFF((
    SELECT ', [st' + CONVERT(VARCHAR(10), sv.number) + '] FLOAT'
	FROM [master].dbo.spt_values sv
	WHERE sv.number BETWEEN @i AND @cc
		AND sv.[type] = 'P'
    FOR XML PATH('')), 1, 2, '')

EXEC sys.sp_executesql @SQL
    
SELECT * FROM #rt


Вообще можно бы обойтись и без цикла. Это первое.
Если такой подход Вам больше понравился, можно почитать более подробнее тут.

Относительно мнения @Glory - полностью с ним согласен. Вашего ТЗ я не знаю, поэтому скажу так: "Таблицы с произвольным кол-вом столбцом это зло".
8 апр 15, 13:09    [17488026]     Ответить | Цитировать Сообщить модератору
 Re: Временные таблицы с решётками  [new]
R-Magistr
Member

Откуда:
Сообщений: 356
Glory
R-Magistr
Ты говоришь говнокод? что ты имеешь ввиду? запихнуть это всё в строку и её выполнить? или что тогда?

Весь ваш подход - говнокод.
Для того, чтобы писать код, который сам генерит выполняемый код, нужно хотя бы уметь руками выполняемый код писать.


Ну ладно, возможно где-то умеют лучше ))))))
Я тут поэтому и спрашиваю )))) Всего доброго, Глория
8 апр 15, 13:09    [17488033]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить