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

Откуда:
Сообщений: 216
Тестирую в QA:

DECLARE @columnCountInTable INTEGER
...
IF OBJECT_ID('tempdb..#myQuery') <> 0 DROP TABLE #myQuery
CREATE TABLE #myQuery (UID INTEGER, LIBRARY_NAME NVARCHAR(40), DRIVE_NAME NVARCHAR(40), DEVICE_TYPE NVARCHAR(40), DEVICE NVARCHAR(40), ELEMENT REAL, ALLOCATED_TO NVARCHAR(40))
SELECT @columnCountInTable = COUNT(*) FROM syscolumns WHERE id = OBJECT_ID('tempdb..#myQuery')
PRINT @columnCountInTable

Запускаю несколько раз подряд -
возвращается какой-то маразм: какое-то левое значение, причем обычно разное: 45, 2, 1, 0, 4.....

Вариант с

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME =

вообще ноль даёт всегда...

Проблема во временном характере таблицы, что ли?
19 июл 05, 17:12    [1717308]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Проблема во временном характере таблицы, что ли?
Проблема в том, что текущая база у вас не tempdb. Поэтому в ее таблице syscolumns нет объекта tempdb..#myQuery
19 июл 05, 17:22    [1717356]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
FROM tempdb.dbo.syscolumns :)

Спасибо большое!!!
Уж как ни смотрел - а просмотрел.
19 июл 05, 17:25    [1717369]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Извиняюсь за назойливость, но рано я обрадовался...

USE TEMPDB

DECLARE @columnCountInTable INTEGER
DECLARE @columnName VARCHAR(40)
SET @columnCountInTable = 0
IF OBJECT_ID('tempdb..#mQuery') is not null DROP TABLE #mQuery
CREATE TABLE #mQuery (UID INTEGER, LIBRARY_NAME NVARCHAR(40), DRIVE_NAME NVARCHAR(40), DEVICE_TYPE NVARCHAR(40), DEVICE NVARCHAR(40), ELEMENT REAL, ALLOCATED_TO NVARCHAR(40))

PRINT COL_NAME(OBJECT_ID('tempdb..#mQuery'), 1)

Когда я убираю USE TEMPDB, поскольку, естественно, работаю с другой базой данных - не могу получить имя столбца временной таблицы: опять же всё время возвращается что-то разное. Здесь, мне кажется, я нигде не пропустил ничего.

Самое интересное - работает же с нелепым USE TEMPDB! :)
19 июл 05, 17:46    [1717480]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Ага! В CREATE TABLE надо полный путь указывать!

Хм, странно... я думал, что это по умолчанию подразумевается...
19 июл 05, 17:48    [1717497]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну так COL_NAME() тоже работает для текущей базы
19 июл 05, 17:49    [1717501]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nafigator
Ага! В CREATE TABLE надо полный путь указывать!

Хм, странно... я думал, что это по умолчанию подразумевается...


Временные таблицы всегда создаются только в tempdb
19 июл 05, 17:50    [1717505]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Черт побери, это сработало на локалхосте.

Когда использовал полный путь на сервере - стало ругаться

Database name 'tempdb' ignored, referencing object in tempdb
19 июл 05, 17:51    [1717512]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Хм, как же решить проблему? В руководстве говорится

When specifying a temporary table name, the database name must precede the temporary table name, for example:

автор
SELECT OBJECT_ID('tempdb..#mytemptable')


Т.е. вроде бы делал всё по правилам - а ничего не вышло :(
19 июл 05, 17:53    [1717527]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Хм, как же решить проблему?
А какую проблему мы решаем ?

В руководстве говорится
When specifying a temporary table name, the database name must precede the temporary table name, for example:
автор
SELECT OBJECT_ID('tempdb..#mytemptable')

Т.е. вроде бы делал всё по правилам - а ничего не вышло :(

OBJECT_ID вернет вам ID объекта в _той базе, где создан объект_.
Что не так ?
19 июл 05, 17:56    [1717547]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Т.е., если я верно понял, OBJECT_ID уникально лишь в пределах одной базы данных?
И когда я применяю к нему COL_NAME, то MSSQL пытается найти такой ID в текущей базе?

Что ж мне, перед использованием COL_NAME каждый раз переключать на TEMPDB, а потом - обратно, на свою базу?
19 июл 05, 17:58    [1717555]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
А проблема - в том, что я не могу получить имена столбцов из временной таблицы, если не использую USE TEMPDB...
19 июл 05, 18:00    [1717567]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nafigator
Т.е., если я верно понял, OBJECT_ID уникально лишь в пределах одной базы данных?
И когда я применяю к нему COL_NAME, то MSSQL пытается найти такой ID в текущей базе?

Да.
Да.
19 июл 05, 18:02    [1717580]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Nafigator
А проблема - в том, что я не могу получить имена столбцов из временной таблицы, если не использую USE TEMPDB...


SELECT * FROM tempdb..syscolumns WHERE id = OBJECT_ID('tempdb..#myQuery')
19 июл 05, 18:02    [1717583]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
А есть какой-то легкий способ к ним через порядковый номер обращаться?

По указанной причине COL_NAME был очень удобен...

Эх, был бы массив или список в MSSQL - занес бы эти имена туда и пользовался.
А так... даже что-то идей нету изящных :(
19 июл 05, 18:30    [1717722]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
А есть какой-то легкий способ к ним через порядковый номер обращаться?
Обращаться это получать значение ? Или что-то другое ?
19 июл 05, 18:34    [1717741]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
У меня присутствует несколько циклов (с инкрементирующейся переменной), в которых идет "пробежка" по всем столбцам.

Там фигурирует COL_NAME для двух целей:
1) кое-где нужно само имя;
2) кое-где нужно прилепить имя в строку, которая скармливается динамическому запросу - соответственно запрос используется, в частности, для получения значения данных столбцов;
19 июл 05, 18:38    [1717760]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
И почему таблица syscolumns не подходит для этих целей ?
19 июл 05, 19:01    [1717877]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Ну, не знаю, насколько я изящен... :) Но вот что у меня получилось:

			SET @selectRequest = 'SELECT [name] AS tempString FROM tempdb.dbo.syscolumns WHERE id = ' + CAST(OBJECT_ID('tempdb..#myQuery') AS VARCHAR(40)) + ' AND colorder = ' + CAST(@columnNumber AS VARCHAR(40))
			EXEC SP_EXECUTESQL @selectRequest

Вот только почему-то после выполнения запроса выводится это значение в QA (tempString), хотя его и не просят...
19 июл 05, 19:57    [1718006]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
И вообще - не работает такая конструкция:

DECLARE @selectRequest NVARCHAR(4000), @tempString NVARCHAR(40), @tempString2 VARCHAR(40), @columnNumber INTEGER, @matchCount INTEGER

IF OBJECT_ID('tempdb..#mQuery') is not null DROP TABLE #mQuery
CREATE TABLE #mQuery (UID INTEGER, LIBRARY_NAME NVARCHAR(40), DRIVE_NAME NVARCHAR(40), DEVICE_TYPE NVARCHAR(40), DEVICE NVARCHAR(40), ELEMENT REAL, ALLOCATED_TO NVARCHAR(40))
INSERT INTO #mQuery VALUES(1, 'LIBA1', 'DRIVA1', 'COOL1', 'HDD', 300, 'PLACE1')
INSERT INTO #mQuery VALUES(2, 'LIBA2', 'DRIVA2', 'COOL2', 'FDD', 1.44, 'PLACE2')

SET @columnNumber = 3
SET @matchCount = 2
SET @selectRequest = 'SELECT TOP 1 name FROM tempdb.dbo.syscolumns WHERE id = ' + CAST(OBJECT_ID('tempdb..#mQuery') AS VARCHAR(40)) + ' AND colorder = ' + CAST(@columnNumber AS VARCHAR(40))
EXECUTE SP_EXECUTESQL @selectRequest, @tempString OUTPUT

SET @selectRequest = 'SELECT TOP 1 ' + @tempString + ' FROM #mQuery WHERE uid = ' + CAST(@matchCount AS VARCHAR(40))
EXECUTE SP_EXECUTESQL @selectRequest, @tempString OUTPUT

А если во втором случае явно указываю DRIVE_NAME (результат выполнения первого запроса) - тогда всё ок.
19 июл 05, 20:22    [1718041]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
А вот так получилось:

DECLARE @selectRequest NVARCHAR(4000), @tempString NVARCHAR(40), @tempString2 VARCHAR(40), @columnNumber INTEGER, @matchCount INTEGER

IF OBJECT_ID('tempdb..#mQuery') is not null DROP TABLE #mQuery
CREATE TABLE #mQuery (UID INTEGER, LIBRARY_NAME NVARCHAR(40), DRIVE_NAME NVARCHAR(40), DEVICE_TYPE NVARCHAR(40), DEVICE NVARCHAR(40), ELEMENT REAL, ALLOCATED_TO NVARCHAR(40))
INSERT INTO #mQuery VALUES(1, 'LIBA1', 'DRIVA1', 'COOL1', 'HDD', 300, 'PLACE1')
INSERT INTO #mQuery VALUES(2, 'LIBA2', 'DRIVA2', 'COOL2', 'FDD', 1.44, 'PLACE2')

SET @columnNumber = 4
SET @matchCount = 1
SELECT @tempString = name FROM tempdb.dbo.syscolumns WHERE id = OBJECT_ID('tempdb..#mQuery') AND colorder = @columnNumber

SET @selectRequest = 'SELECT ' + @tempString + ' AS tempString FROM #mQuery WHERE uid = ' + CAST(@matchCount AS VARCHAR(40))
EXECUTE SP_EXECUTESQL @selectRequest

Хм... Наверняка это еще не конец истории :(
19 июл 05, 20:29    [1718051]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Чудеса какие-то!!

После выполнения EXEC-а каждый раз выводится значение tempString - и оно верное. Т.е. 1, 2, LIBA1, LIBA2 и т.д.
Но когда я пытаюсь использовать это значение (мне нужно записывать его в базу в указанном порядке - записывается не значение, а имя столбца! Т.е. то значение, которое было получено на предыдущем шаге:

SELECT @tempString = name FROM tempdb.dbo.syscolumns WHERE id = OBJECT_ID('tempdb..#mQuery') AND colorder = @columnNumber

Если же в AS я пытаюсь использовать другую переменную - tempString2, то вообще записывается NULL :(

Я пытался использовать список параметров для sp_executesql, а запрос привел к форме N'....'
- но тогда значения даже не выводились - выводились имена столбцов на каждом шаге...
19 июл 05, 21:57    [1718159]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Glory
Member

Откуда:
Сообщений: 104760
У вас полное непонимание принципов динамического запроса в TSQL
https://www.sql.ru/faq/faq_topic.aspx?fid=104
19 июл 05, 22:11    [1718171]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Я как раз дошел до этой ссылки.

Пока что остановился на варианте

			WHILE (@matchCount < @rowCountInTable + 1)
			BEGIN
				SET @selectRequest = N'SELECT @tempString = name FROM tempdb.dbo.syscolumns WHERE id = @objID AND colorder = @columnNumber'
				EXECUTE SP_EXECUTESQL @selectRequest, N'@tempString NVARCHAR(40) OUTPUT, @columnNumber INTEGER, @objID INTEGER', @tempString = @tempString OUTPUT, @columnNumber = @columnNumber, @objID = OBJECT_ID('tempdb..#myQuery')
				SET @selectRequest = N'SELECT @tempString2 = @tempString FROM #myQuery WHERE uid = @matchCount'
				EXECUTE SP_EXECUTESQL @selectRequest, N'@tempString2 NVARCHAR(40) output, @tempString NVARCHAR(40), @matchCount INTEGER', @tempString2 = @tempString2 OUTPUT, @tempString = @tempString, @matchCount = @matchCount
				SET @wddxText = @wddxText + '<string>' + @tempString2 + '</string>'
				SET @matchCount = @matchCount + 1
			END

Вот только ругается на синтаксис возле функции OBJECT_ID.
Что ж, так, мало-помалу - думаю, всё получится... Мучаю дальше.
19 июл 05, 22:24    [1718186]     Ответить | Цитировать Сообщить модератору
 Re: Почему не возвращается количество столбцов временной таблицы?  [new]
Nafigator
Member

Откуда:
Сообщений: 216
Ну вот, после создания таблицы переменной objID присвоен идентификатор временной таблицы...

А в результате всё равно в @tempString2 упорно получаю не значение столбца, а его имя! Т.е. подстановка @tempString2 не отличается от подстановки @tempString:

<wddxPacket version='1.0'><header/><data><recordset rowCount='2' fieldNames='UID,LIBRARY_NAME,DRIVE_NAME,DEVICE_TYPE,DEVICE,ELEMENT,ALLOCATED_TO' type='coldfusion.sql.QueryTable'><field name='UID'><string>UID</string><string>UID</string></field>blablabla

Стоит только поставить в константу второго запроса значение столбца вместо @tempString (к примеру, DRIVE_NAME) - и формируется всё верно. Да вот только мне же надо столбцы чередовать...

Да, я еще слабо знаю SQL - а кого это интересует? Поставлена задача - до завтра надо выполнить :(
19 июл 05, 22:35    [1718208]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить