SQL выбирает строку в строковую переменную, не зная столбцов - PullRequest
3 голосов
/ 24 февраля 2010

Я новичок в написании SQL и буду очень признателен за помощь в решении этой проблемы. :)

Я пытаюсь выделить всю строку в строку, желательно через пробел или запятую. Я хотел бы сделать это в общем, без необходимости знать особенности столбцов в таблицах.

Я бы хотел сделать следующее:

DECLARE @MyStringVar NVARCHAR(MAX) = ''
@MyStringVar = SELECT * FROM MyTable WHERE ID = @ID AS STRING

Но то, что я в итоге сделал, было:

DECLARE @MyStringVar = ''
DECLARE @SecificField1 INT
DECLARE @SpecificField2 NVARCHAR(255)
DECLARE @SpecificField3 NVARCHAR(1000)
...
SELECT @SpecificField1 = Field1, @SpecificField2 = Field2, @SpecificField3 = Field3 FROM MyTable WHERE ID = @ID
SELECT @StringBuilder = @StringBuilder + CONVERT(nvarchar(10), @Field1) + ' ' +  @Field2 + ' ' + @Field3

Тьфу. (

Я видел, как некоторые люди публиковали информацию о функции COALESCE, но, опять же, я не видел, чтобы кто-то использовал ее без определенных имен столбцов.

Кроме того, я подумал, что, возможно, есть способ использовать имена столбцов для их динамического получения:

SELECT [COLUMN_NAME] FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable' 

Не похоже, чтобы это было так сложно. (

То, что я сделал, работает сейчас, но заранее спасибо всем, кто может указать мне на лучшее решение. :)

EDIT: Исправлено, спасибо всем, кто ответил. :)

Ответы [ 5 ]

3 голосов
/ 24 февраля 2010

попробуй:

DECLARE @SQL nvarchar(MAX), @YourTable nvarchar(200)
SET @YourTable='YourTableName'
SELECT @SQL=
    STUFF(
             (
                  SELECT
                  ' + '','' + COALESCE(''''''''+CONVERT(NVARCHAR(MAX),['+c.COLUMN_NAME+']'+CASE WHEN c.DATA_TYPE='datetime' THEN ',121' ELSE '' END+')+'''''''',''null'')'
                      FROM INFORMATION_SCHEMA.COLUMNS c
                      WHERE c.TABLE_NAME = 'ap_voucher'
                      ORDER BY ORDINAL_POSITION
                      FOR XML PATH('')
             ), 1, 9, ''
         )
SET @SQL = 'SELECT ' + @SQL + ' FROM '+@YourTable
exec (@SQL)

пример вывода:

---------------------------------------------------------------------------
'030',null,'I','Zzz0',null,'1000021111          ','2000-03-01 00:00:00.000'
'001',null,'I','zzz0',null,'900099618           ','1999-12-03 00:00:00.000'
'001',null,'I','ET10',null,'KOU557              ','1999-11-01 00:00:00.000'
'001',null,'I','Mzzz',null,'017288              ','1999-11-12 00:00:00.000'
1 голос
/ 24 февраля 2010

Чтобы сделать это динамически, просто зная имя таблицы, вы можете использовать этот подход:

DECLARE @nSQL NVARCHAR(MAX)
SELECT @nSQL = COALESCE(
     @nSQL + ' + '','' + CAST(ISNULL([' + c.COLUMN_NAME + '], '''') AS NVARCHAR(MAX))', 
    'CAST([' + c.COLUMN_NAME + '] AS NVARCHAR(MAX))')
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_NAME = 'TestTable'

SET @nSQL = 'SELECT ' + @nSQL + ' FROM YourTable'

EXECUTE sp_executesql @nSQL

Хотя это зависит от вашей конечной цели.

Это будет обрабатывать нулевые значения в столбцах, но (например) целые числа NULL получаются, например, как 0.

0 голосов
/ 25 февраля 2010

Если целью является отслеживание изменений, то я бы рекомендовал не использовать конкатенацию, как предложено KM.

  1. Порядок столбцов должен оставаться неизменным.Если порядок столбцов изменяется даже незначительно, значения значений будут в лучшем случае расплывчатыми или, скорее всего, утраченными.Рекомендуется никогда не полагаться на порядок столбцов.

  2. Поскольку таблица становится шире и / или содержит много данных, конкатенация будет выполняться медленнее.SQL Server не знает для эффективной конкатенации.Далее, представьте таблицу с парой дюжин полей nvarchar (max), скажем, 2000 символов каждое.Это даст строку порядка 48 КБ!

  3. Возможно, вам придется изменить разделитель.Предположим, у меня есть значение, равное «Боль», «Страдание» и «Проблемы».Этот тип записи создаст проблемы при анализе данных.

Если вы используете SQL Server 2008, я бы рекомендовал использовать механизм отслеживания изменений SQL Server.Если вы этим не пользуетесь, я бы порекомендовал приобрести сторонний инструмент аудита.Если это тоже не вариант, я бы записал удаленное значение в другую таблицу, используя триггер.По крайней мере, это заставляет вас убедиться, что схема данных аудита синхронизирована с исходной схемой.

0 голосов
/ 24 февраля 2010

Примерно так может работать, если вы можете обрабатывать вывод в формате XML:

DECLARE @MyStringVar NVARCHAR(MAX) = ''
SET @MyStringVar = (SELECT * FROM MyTable WHERE ID = @ID FOR XML RAW)

SELECT @MyStringVar 

В качестве дополнительного бонуса, если ваши данные поддаются ему, вы можете убрать форматирование XML с этим, вместо SELECT @MyStringVar:

SELECT REPLACE(REPLACE(REPLACE(REPLACE(@MyStringVar, '<row ', ''), '="', ' '), '" ', ', '), '"/>', '')

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


Только что заметил, что похоже, что вы не хотите, чтобы имена столбцов отображались вместе с данными. В этом случае один из запросов information_schema в других ответах будет лучшим способом получить то, что вы хотите.

0 голосов
/ 24 февраля 2010

Короткий ответ: вы не можете этого сделать.

Единственное, что вы можете сделать, - это то, что у вас есть.

SELECT @MyField1 = MyField1, @MyField2= MyField2...etc FROM MyTable

И тогда вы можете объединить эти поля:

SELECT @MyResult = (SELECT @MyField1 + @MyField2 + MyField3...)

SELECT @MyResult
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...