Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Он все правильно говрит. И делает так, как в документации написано Сообщение было отредактировано: 8 апр 15, 12:22 |
||
8 апр 15, 12:21 [17487695] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
R-Magistr Member Откуда: Сообщений: 356 |
Glory, Здравствуйте, Глория )))) Вопросы, где ж тогда он создаёт мне таблицу? И как мне её ко мне притащить? |
8 апр 15, 12:29 [17487741] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
На все эти вопросы вы найдете ответы в хелпе. В статье CREATE TABLE |
||
8 апр 15, 12:31 [17487761] Ответить | Цитировать Сообщить модератору |
R-Magistr Member Откуда: Сообщений: 356 |
Поправил код, внёс туда select @str='' ,@i=1 Результат тот же |
||
8 апр 15, 12:37 [17487803] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11568 |
ТС, а зачем вам нужен весь этот цирк с динамикой? |
8 апр 15, 12:39 [17487818] Ответить | Цитировать Сообщить модератору |
R-Magistr Member Откуда: Сообщений: 356 |
Выдал Msg 102, Level 15, State 1, Line 1 Incorrect syntax near 'table'. |
||
8 апр 15, 12:41 [17487833] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
Прощу прощение, но результат не тот же. @LexusR уже дал Вам хорошие вариант для дальнейших действий. В том числе я немного подсказал. В чем проблема? ИМХО, все весьма очевидно. |
8 апр 15, 12:42 [17487836] Ответить | Цитировать Сообщить модератору |
R-Magistr Member Откуда: Сообщений: 356 |
конечное значение цикла, оно же 500, будет переменным, т.е. не известно сколько его там будет, может 1 может 2 может 10 000 |
||
8 апр 15, 12:42 [17487839] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
select @str='alter table #rt add '+ STUFF(@str, 1,1, '') exec (@str) Вы не постарались вникнуть в суть предложенного. 1. Запятая в столбцах. 2. Не инициализированные переменные. |
8 апр 15, 12:44 [17487851] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
И что вы будете дальше делать с неизвестным количеством полей ? 10 000 - это смешно. |
||
8 апр 15, 12:48 [17487875] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11568 |
так зачем вам этот цикл и зачем такая временная таблица? вы же её как-то хотите использовать, где именно, в неком приложении или прямо в коде ХП? какую задачу вы решаете? может её проще решить другим способом |
||||
8 апр 15, 12:48 [17487881] Ответить | Цитировать Сообщить модератору |
R-Magistr Member Откуда: Сообщений: 356 |
AlanDenton, Большое спасибо и Вам и Лексусу, спасибо большое ))) Глория тебе то же спасибо ))) |
8 апр 15, 12:52 [17487914] Ответить | Цитировать Сообщить модератору |
AlanDenton Member [скрыт] Откуда: Сообщений: 1004 |
DECLARE @str VARCHAR(8000) = '' я бы заменил на DECLARE @str VARCHAR(MAX) = '' если ожидается большое число итераций. Но помните, что у таблицы ограничение на максимальное кол-во столбов. Сколько именно, если честно, не вспомню. Вроде не более 30к при условии что используются разреженные столбцы. А так не более 1024. Пжл. |
8 апр 15, 12:56 [17487949] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
За говнокод не благодоряд. |
||
8 апр 15, 12:57 [17487952] Ответить | Цитировать Сообщить модератору |
R-Magistr Member Откуда: Сообщений: 356 |
Ну а как лучше сделать? Только с примером |
||||
8 апр 15, 12:59 [17487970] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Сделать что ? Таблицу с неизвестным количеством полей ? Чтобы дальше обрабатывать ее неизвестными способами для получения неизвестного результата ? |
||||
8 апр 15, 13:01 [17487978] Ответить | Цитировать Сообщить модератору |
R-Magistr Member Откуда: Сообщений: 356 |
Ты говоришь говнокод? что ты имеешь ввиду? запихнуть это всё в строку и её выполнить? или что тогда? |
||||
8 апр 15, 13:03 [17487987] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
Весь ваш подход - говнокод. Для того, чтобы писать код, который сам генерит выполняемый код, нужно хотя бы уметь руками выполняемый код писать. |
||
8 апр 15, 13:06 [17488006] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
|
||
8 апр 15, 13:07 [17488016] Ответить | Цитировать Сообщить модератору |
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] Ответить | Цитировать Сообщить модератору |
R-Magistr Member Откуда: Сообщений: 356 |
Ну ладно, возможно где-то умеют лучше )))))) Я тут поэтому и спрашиваю )))) Всего доброго, Глория |
||||
8 апр 15, 13:09 [17488033] Ответить | Цитировать Сообщить модератору |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Все форумы / Microsoft SQL Server | ![]() |