T SQL Конвертировать строку в строку - PullRequest
1 голос
/ 21 января 2010

Есть ли допустимый способ в SQL Server 2005 для чтения строки данных в строку?

Например, если моя таблица выглядела следующим образом:

ID | First Name | Last Name | Color
-----------------------------------
 1 | Timmy      | Jones     | pink
 2 | Martha     | Fisher    | green

Что я мог бы вернуть в результате:

'1 Timmy Jones pink'
'2 Martha Fisher green'

Желательно, чтобы я мог вернуться с добавленным именем столбца, например:

'ID: 1, First Name: Timmy, Last Name: Jones, Color: pink'
'ID: 2, First Name: Martha, Last Name: Fisher, Color: green'

Обновление:

Я ищу динамическое решение, поэтому думаю, что запрос к INFORMATION_SCHEMA будет более уместным.

Это на самом деле немного помогает, потому что я пытаюсь отключить его от триггера обновления, поэтому у меня будет по одной строке за раз, и я могу запросить INFORMATION_SCHEMA для основной таблицы, проверяющей типы данных для исключения текста, ntext и изображение, которое генерируют таблицы, «вставленные» и «удаленные».

Решение: (обновлено: пришлось добавить еще код для возврата одного значения)

-- passed in table name & schema
DECLARE @table_name nvarchar(100)
DECLARE @schema_name nvarchar(100)

-- set initial value
SET @table_name = 'my_table'
SET @schema_name = 'dbo'

-- Variable to hold query
DECLARE @sql nvarchar(MAX)
SET @sql = 'SELECT @row_stringOUT = '

-- Query columns meeting criteria and build query
SELECT
    -- Query as one string
    @sql = (@sql + '  ''  ' + COLUMN_NAME + ': '' + CASE WHEN ' + COLUMN_NAME + ' IS NULL THEN '''' WHEN ISDATE(' + COLUMN_NAME + ') = 1 THEN CONVERT(nvarchar(100), ' + COLUMN_NAME + ', 120) ELSE CAST(' + COLUMN_NAME + ' AS nvarchar(100)) END + ')
FROM 
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    table_schema = @schema_name
    AND
    table_name = @table_name
    AND
    -- Filter out unuseable data types
    data_type NOT IN ('text', 'ntext', 'image')

-- Trim extra character before FROM statement then add FROM statement
SELECT @sql = LEFT(@sql, LEN(@sql) - 1) + ' FROM ' + @table_name;

-- Execute Query
DECLARE @params nvarchar(MAX)
SET @params = N'@row_stringOUT ntext OUTPUT';

DECLARE @ret_value nvarchar(MAX)

EXEC sp_executesql
    @sql
    , @params
    , @row_stringOUT = @ret_value OUTPUT

SELECT @ret_value

Ответы [ 3 ]

1 голос
/ 21 января 2010

вы можете просто объединить столбцы.если вы хотите получить имена столбцов, вам придется использовать некоторое сочетание динамических SQL, INFORMATION_SCHEMA представлений и запросов ...

SELECT  cast(ID as varchar(10)) + ' ' + [First Name] + ' ' + [Last Name] + ' ' + Color 
FROM    MyTable
1 голос
/ 21 января 2010

Select CAST(ID As Varchar(8)) + ' ' + [First Name] + ' ' + [Last Name] + ' ' + Color From TheTable

Чтобы получить подробное форматирование, которое вы упомянули:

Select 'ID: ' + CAST(ID As Varchar(8)) + ', First Name: ' + [First Name] + ', Last Name: ' + [Last Name] + ', Color: ' + Color From TheTable

Редактировать: теперь предполагая, что ID является целочисленным автономером. Скорее всего, как указывает адждамс.

0 голосов
/ 21 января 2010

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

SELECT CAST (ID AS varchar (10)) + '' + [имя] + '' + [фамилия + '' + цвет
ИЗ MYTABLE

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