SQL Server:动态concat不能按大小写顺序使用

时间:2018-08-11 10:28:47

标签: sql sql-server dynamic dynamic-sql

我遇到了一个问题,即concat不能将行连接为单个字符串。

这是行数据

  • 案例1编号:123
  • 联系电子邮件:dfFff
  • 联系电话
  • 升级原因:fddf
  • 联系方式:电子邮件

这是有效的查询

declare @body nvarchar(MAX),
@details  nvarchar(MAX)

set @details = ''

select @details = @details + '<B>' + f.name + '</B>: ' + COALESCE( s.select_value, d.field_data) + CHAR(13)+'<BR/>'
from primaryTable d
inner join fields f on f.field_id = d.field_id
left outer join select_fields s on s.field_id = d.field_id 
                                and s.select_text = d.field_data
where data_id = 123
order by f.sort_id

此查询无效

declare @body nvarchar(MAX),
@details  nvarchar(MAX)

set @details = ''

select @details = @details + '<B>' + f.name + '</B>: ' + COALESCE( s.select_value, d.field_data) + CHAR(13)+'<BR/>'
from primaryTable d
inner join fields f on f.field_id = d.field_id
left outer join select_fields s on s.field_id = d.field_id 
                                and s.select_text = d.field_data
where data_id = 123
order by
        case 
            when f.parent_id = 0 
               then f.sort_id
               else (select  fs.sort_id + 1
                     from fields fs
                     where fs.field_id = f.parent_id) 
        end, 
        case 
           when f.sort_id = 0 then 1 
        end desc,  
        f.sort_id

以上查询仅返回

<B>Contact Phone Number</B>: 
<BR/>

我正在使用SQL Server 2012

根据请求,这里是表DDL

 CREATE TABLE [dbo].[primaryTable ](
    [na_fields_data_id] [int] IDENTITY(1,1) NOT NULL,
    [data_id] [int] NOT NULL,
    [field_id] [int] NOT NULL,
    [field_data] [varchar](max) NULL CONSTRAINT [DF__na_survey__field__1332DBDC]  DEFAULT (NULL),
 CONSTRAINT [PK__na_surve__5E098220114A936A] PRIMARY KEY CLUSTERED 
(
    [na_fields_data_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO



 CREATE TABLE [dbo].[select_fields](
    [field_select_id] [int] IDENTITY(1,1) NOT NULL,
    [field_id] [int] NOT NULL,
    [select_text] [varchar](255) NULL DEFAULT (NULL),
    [select_value] [varchar](255) NULL DEFAULT (NULL),
    [sort_id] [int] NULL DEFAULT (NULL),
PRIMARY KEY CLUSTERED 
(
    [field_select_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO



CREATE TABLE [dbo].[fields ](
    [field_select_id] [int] IDENTITY(1,1) NOT NULL,
    [field_id] [int] NOT NULL,
    [select_text] [varchar](255) NULL DEFAULT (NULL),
    [select_value] [varchar](255) NULL DEFAULT (NULL),
    [sort_id] [int] NULL DEFAULT (NULL),
PRIMARY KEY CLUSTERED 
(
    [field_select_id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO

1 个答案:

答案 0 :(得分:0)

对不起,我的回复很晚,我完全被其他事情困扰了。

所以我解决的方法是通过获取动态sql输出并将其转储到临时表中,然后使用临时表联系最终输出。

示例:

select '<B>' + f.name + '</B>: ' + COALESCE( s.select_value, d.field_data) + CHAR(13)+'<BR/>' 'SELECTVALUE'
into #TempDump 
from primaryTable d
inner join fields f on f.field_id = d.field_id
left outer join select_fields s on s.field_id = d.field_id 
                                and s.select_text = d.field_data
where data_id = 123
order by
        case 
            when f.parent_id = 0 
               then f.sort_id
               else (select  fs.sort_id + 1
                     from fields fs
                     where fs.field_id = f.parent_id) 
        end, 
        case 
           when f.sort_id = 0 then 1 
        end desc,  
        f.sort_id

SELECT @details = @details + x.SELECTVALUE FROM #TempDump x