2013-05-20 3 views
0

У меня есть таблица с именем TBL_SUBACC и поля: Account, Branch, Ftype, ArmCode,DrlsttrDate, CrlsttrDate, TelNo т.д.Получить разграничены данные из таблицы в SQL Server

В настоящее время я получаю | разделенные данные, используя следующий запрос:

select account +'|'+ branch +'|' + armcode as delimited_data from 
    ReportingFramework.dbo.TBL_SUBACC 

Это дает результат as:

delimited_data 
    111123|01|C0013 
    111124|01|C0013 
    1234121|05|C0324 
    0120219|02|C0329 
    0212108|03|C3232 
    111121|01|C0013 

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

Как сделать select *, чтобы получить информацию из таблицы?

+2

просто указать имя столбца. в чем проблема? –

+0

@JW 웃 нет другого варианта без указания имен столбцов? –

+0

кажется, что ваш запрос работает нормально. почему вы хотите его улучшить? –

ответ

2
declare @nsql nvarchar(max); 
set @nsql = ' 
select ' + stuff((
    select '+''|''+isnull(cast(' + quotename(name) + ' as nvarchar(max)),'''') ' 
    from sys.columns 
    where object_id=object_id('YOUR_TABLE_NAME') 
    order by column_id 
    for xml path(''), type).value('/','nvarchar(max)'), 1, 5, '') + ' as delimited_data 
from YOUR_TABLE_NAME'; 
--print @nsql; 
exec (@nsql); 

Замените YOUR_TABLE_NAME (дважды) на целевую таблицу. Чтобы сделать это правильно, вам необходимо выполнить преобразование в VARCHAR и NULL. Это работает очень плохо для datetimes, которые выходят в страшном формате для использования в расписании с помощью другого программного обеспечения. Лучше, если вы просто остановитесь на print @nsql и сделайте ручную настройку перед запуском.

+0

В нем говорится, что команда успешно завершена. «Но я не вижу данных. –

+1

Вы фактически заменили 'YOUR_TABLE_NAME', ну, ваше имя таблицы? – RichardTheKiwi

1

Попробуйте один -

Запрос:

DECLARE @table_name SYSNAME 
SELECT @table_name = 'dbo.test' 

DECLARE @SQL NVARCHAR(MAX); 
SELECT @SQL = 'SELECT delimited_data = ' + STUFF((
    SELECT CHAR(13) + ' + ''|'' + ' + 
    CASE WHEN c.is_nullable = 1 
     THEN 'ISNULL(CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX)),'''') ' 
     ELSE 'CAST(' + QUOTENAME(c.name) + ' AS NVARCHAR(MAX))' 
    END 
    FROM sys.columns c WITH (NOWAIT) 
    WHERE c.[object_id] = OBJECT_ID(@table_name) 
    ORDER BY c.column_id 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 10, CHAR(13)) + ' 
FROM ' + @table_name 

PRINT @SQL 

EXEC sys.sp_executesql @SQL 

Выход:

SELECT delimited_data = 
      CAST([WorkOutID] AS NVARCHAR(MAX)) 
    + '|' + CAST([DateOut] AS NVARCHAR(MAX)) 
    + '|' + CAST([EmployeeID] AS NVARCHAR(MAX)) 
    + '|' + CAST([DepartmentUID] AS NVARCHAR(MAX)) 
    + '|' + ISNULL(CAST([WorkPlaceUID] AS NVARCHAR(MAX)), '') 
    + '|' + ISNULL(CAST([CategoryID] AS NVARCHAR(MAX)), '') 
FROM dbo.test 
Смежные вопросы