Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Убрать "мусор"  [new]
PaulWist
Member

Откуда:
Сообщений: 2299
Дано:

use tempdb

create table #test ([Name] nvarchar(10))

INSERT #TEST VALUES(N'Молоко')
INSERT #TEST VALUES(N'Сметана')
INSERT #TEST VALUES(N' ')
INSERT #TEST VALUES(N'Гвозди')
INSERT #TEST VALUES(N'Машины')

select cast([Name] as nvarchar) from #test FOR XML PATH('') 

drop table #test


автор
Результат

МолокоСметана & # x 2 0 ; ГвоздиМашины


Вопрос: как бы при конвертации в строку избавиться от & # x 2 0 ; (разделено пробелами), что бы "печатался" пробел?
10 ноя 21, 14:47    [22394220]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4434
replace сверху пустить
10 ноя 21, 15:23    [22394252]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
PaulWist,

select cast([Name] as nvarchar)+',' from #test FOR XML PATH('') 
10 ноя 21, 16:29    [22394317]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
PaulWist
Member

Откуда:
Сообщений: 2299
Владислав Колосов
PaulWist,

select cast([Name] as nvarchar)+',' from #test FOR XML PATH('') 


Ммм, запятые не нужны, потом их как выковыривать из конечной строки, как отличить "свою запятую" от "родной, что уже была" :)

PS мысль я понял, что нужен "вменяемый" разделитель/символ, которого нет в исходной строке - не вариант, придётся клеить динамику.
10 ноя 21, 16:51    [22394333]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
aleks222
Member

Откуда:
Сообщений: 1846
PaulWist
Владислав Колосов
PaulWist,

select cast([Name] as nvarchar)+',' from #test FOR XML PATH('') 


Ммм, запятые не нужны, потом их как выковыривать из конечной строки, как отличить "свою запятую" от "родной, что уже была" :)

PS мысль я понял, что нужен "вменяемый" разделитель/символ, которого нет в исходной строке - не вариант, придётся клеить динамику.



select (select cast([Name] as nvarchar) from #test FOR XML PATH(''), type ).value('.', 'nvarchar(max)')


Сообщение было отредактировано: 10 ноя 21, 17:11
10 ноя 21, 17:06    [22394344]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
PaulWist,

а для чего такие сложности, чтобы склеить строки?
10 ноя 21, 17:06    [22394346]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
invm
Member

Откуда: Москва
Сообщений: 9913
PaulWist
Вопрос: как бы при конвертации в строку избавиться от & # x 2 0 ; (разделено пробелами), что бы "печатался" пробел?
select
 t.x.value('.', 'varchar(max)')
from
 (select cast([Name] as nvarchar) from #test FOR XML PATH(''), type) t(x);
10 ноя 21, 17:10    [22394349]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
PaulWist
Member

Откуда:
Сообщений: 2299
2invm, aleks222, Браво!!! (с меня очередное пиво)

Малёк поправил код (изменил select cast([Name] as nvarchar) на select [Name]), что бы избавиться от 3-х Warnings CONVERT_IMPLICIT

select
 t.x.value('.', 'nvarchar(max)')
from
 (select [Name] from #test FOR XML PATH(''), type) t(x);


тем не менее ещё осталось 2 Warnings

             <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(max),[Expr1027],0)" />
              <PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(max),[Expr1026],0)" />


Вопрос: как бы от них избавиться?

План не пристёгивается, странно, под спойлером.

+
<?xml version="1.0" encoding="utf-16"?>
<ShowPlanXML xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Version="1.518" Build="13.0.5888.11" xmlns="http://schemas.microsoft.com/sqlserver/2004/07/showplan">
<BatchSequence>
<Batch>
<Statements>
<StmtSimple StatementCompId="2" StatementEstRows="1" StatementId="1" StatementOptmLevel="FULL" CardinalityEstimationModelVersion="130" StatementSubTreeCost="1.07997" StatementText="select
t.x.value('.', 'nvarchar(max)')
from
(select [Name] from #test FOR XML PATH(''), type) t(x)" StatementType="SELECT" QueryHash="0x2C8D7B3CA978705D" QueryPlanHash="0x1B114A7BA88935AF" RetrievedFromCache="true" SecurityPolicyApplied="false">
<StatementSetOptions ANSI_NULLS="true" ANSI_PADDING="true" ANSI_WARNINGS="true" ARITHABORT="true" CONCAT_NULL_YIELDS_NULL="true" NUMERIC_ROUNDABORT="false" QUOTED_IDENTIFIER="true" />
<QueryPlan DegreeOfParallelism="1" CachedPlanSize="32" CompileTime="3" CompileCPU="3" CompileMemory="544">
<Warnings>
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(max),[Expr1027],0)" />
<PlanAffectingConvert ConvertIssue="Cardinality Estimate" Expression="CONVERT_IMPLICIT(nvarchar(max),[Expr1026],0)" />
</Warnings>
<MemoryGrantInfo SerialRequiredMemory="0" SerialDesiredMemory="0" />
<OptimizerHardwareDependentProperties EstimatedAvailableMemoryGrant="65536" EstimatedPagesCached="65536" EstimatedAvailableDegreeOfParallelism="8" MaxCompileMemory="6854936" />
<RelOp AvgRowSize="4035" EstimateCPU="1E-07" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Compute Scalar" NodeId="0" Parallel="false" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="1.07997">
<OutputList>
<ColumnReference Column="Expr1030" />
</OutputList>
<ComputeScalar>
<DefinedValues>
<DefinedValue>
<ColumnReference Column="Expr1030" />
<ScalarOperator ScalarString="[Expr1029]">
<Identifier>
<ColumnReference Column="Expr1029" />
</Identifier>
</ScalarOperator>
</DefinedValue>
</DefinedValues>
<RelOp AvgRowSize="4035" EstimateCPU="4.18E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Inner Join" NodeId="1" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="1.07997">
<OutputList>
<ColumnReference Column="Expr1029" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRows="1" Batches="0" ActualEndOfScans="1" ActualExecutions="1" ActualExecutionMode="Row" ActualElapsedms="0" ActualCPUms="0" />
</RunTimeInformation>
<NestedLoops Optimized="false">
<OuterReferences>
<ColumnReference Column="Expr1003" />
</OuterReferences>
<RelOp AvgRowSize="4035" EstimateCPU="1E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="UDX" NodeId="2" Parallel="false" PhysicalOp="UDX" EstimatedTotalSubtreeCost="0.0032885">
<OutputList>
<ColumnReference Column="Expr1003" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRows="1" Batches="0" ActualEndOfScans="1" ActualExecutions="1" ActualExecutionMode="Row" ActualElapsedms="0" ActualCPUms="0" />
</RunTimeInformation>
<Extension UDXName="FOR XML">
<DefinedValues>
<DefinedValue>
<ColumnReference Column="Expr1003" />
</DefinedValue>
</DefinedValues>
<UsedUDXColumns>
<ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[#test]" Column="Name" />
</UsedUDXColumns>
<RelOp AvgRowSize="21" EstimateCPU="0.0001625" EstimateIO="0.003125" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="5" LogicalOp="Table Scan" NodeId="3" Parallel="false" PhysicalOp="Table Scan" EstimatedTotalSubtreeCost="0.0032875" TableCardinality="5">
<OutputList>
<ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[#test]" Column="Name" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRows="5" ActualRowsRead="5" Batches="0" ActualEndOfScans="1" ActualExecutions="1" ActualExecutionMode="Row" ActualElapsedms="0" ActualCPUms="0" ActualScans="1" ActualLogicalReads="1" ActualPhysicalReads="0" ActualReadAheads="0" ActualLobLogicalReads="0" ActualLobPhysicalReads="0" ActualLobReadAheads="0" />
</RunTimeInformation>
<TableScan Ordered="false" ForcedIndex="false" ForceScan="false" NoExpandHint="false" Storage="RowStore">
<DefinedValues>
<DefinedValue>
<ColumnReference Database="[tempdb]" Schema="[dbo]" Table="[#test]" Column="Name" />
</DefinedValue>
</DefinedValues>
<Object Database="[tempdb]" Schema="[dbo]" Table="[#test]" IndexKind="Heap" Storage="RowStore" />
</TableScan>
</RelOp>
</Extension>
</RelOp>
<RelOp AvgRowSize="4035" EstimateCPU="0.0014405" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Aggregate" NodeId="4" Parallel="false" PhysicalOp="Stream Aggregate" EstimatedTotalSubtreeCost="1.07668">
<OutputList>
<ColumnReference Column="Expr1029" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRows="1" Batches="0" ActualEndOfScans="0" ActualExecutions="1" ActualExecutionMode="Row" ActualElapsedms="0" ActualCPUms="0" />
</RunTimeInformation>
<StreamAggregate>
<DefinedValues>
<DefinedValue>
<ColumnReference Column="Expr1029" />
<ScalarOperator ScalarString="MIN(CASE WHEN [Expr1003] IS NULL THEN NULL ELSE CASE WHEN datalength([Expr1026])>=(128) THEN CONVERT_IMPLICIT(nvarchar(max),[Expr1027],0) ELSE CONVERT_IMPLICIT(nvarchar(max),[Expr1026],0) END END)">
<Aggregate AggType="MIN" Distinct="false">
<ScalarOperator>
<IF>
<Condition>
<ScalarOperator>
<Compare CompareOp="IS">
<ScalarOperator>
<Identifier>
<ColumnReference Column="Expr1003" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="NULL" />
</ScalarOperator>
</Compare>
</ScalarOperator>
</Condition>
<Then>
<ScalarOperator>
<Const ConstValue="NULL" />
</ScalarOperator>
</Then>
<Else>
<ScalarOperator>
<IF>
<Condition>
<ScalarOperator>
<Compare CompareOp="GE">
<ScalarOperator>
<Intrinsic FunctionName="datalength">
<ScalarOperator>
<Identifier>
<ColumnReference Column="Expr1026" />
</Identifier>
</ScalarOperator>
</Intrinsic>
</ScalarOperator>
<ScalarOperator>
<Const ConstValue="(128)" />
</ScalarOperator>
</Compare>
</ScalarOperator>
</Condition>
<Then>
<ScalarOperator>
<Convert DataType="nvarchar(max)" Length="2147483647" Style="0" Implicit="true">
<ScalarOperator>
<Identifier>
<ColumnReference Column="Expr1027" />
</Identifier>
</ScalarOperator>
</Convert>
</ScalarOperator>
</Then>
<Else>
<ScalarOperator>
<Convert DataType="nvarchar(max)" Length="2147483647" Style="0" Implicit="true">
<ScalarOperator>
<Identifier>
<ColumnReference Column="Expr1026" />
</Identifier>
</ScalarOperator>
</Convert>
</ScalarOperator>
</Else>
</IF>
</ScalarOperator>
</Else>
</IF>
</ScalarOperator>
</Aggregate>
</ScalarOperator>
</DefinedValue>
</DefinedValues>
<RelOp AvgRowSize="8045" EstimateCPU="0.0024" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="2400" LogicalOp="UDX" NodeId="5" Parallel="false" PhysicalOp="UDX" EstimatedTotalSubtreeCost="1.07524">
<OutputList>
<ColumnReference Column="Expr1026" />
<ColumnReference Column="Expr1027" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRows="1" Batches="0" ActualEndOfScans="1" ActualExecutions="1" ActualExecutionMode="Row" ActualElapsedms="0" ActualCPUms="0" />
</RunTimeInformation>
<Extension UDXName="XQUERY DATA">
<DefinedValues>
<DefinedValue>
<ColumnReference Column="Expr1024" />
</DefinedValue>
<DefinedValue>
<ColumnReference Column="Expr1025" />
</DefinedValue>
<DefinedValue>
<ColumnReference Column="Expr1026" />
</DefinedValue>
<DefinedValue>
<ColumnReference Column="Expr1027" />
</DefinedValue>
<DefinedValue>
<ColumnReference Column="Expr1028" />
</DefinedValue>
</DefinedValues>
<UsedUDXColumns>
<ColumnReference Table="[XML Reader]" Column="id" />
<ColumnReference Table="[XML Reader]" Column="nid" />
<ColumnReference Table="[XML Reader]" Column="tid" />
<ColumnReference Table="[XML Reader]" Column="value" />
<ColumnReference Table="[XML Reader]" Column="lvalue" />
<ColumnReference Table="[XML Reader]" Column="lvaluebin" />
<ColumnReference Column="Expr1020" />
<ColumnReference Table="[XML Reader]" Column="id" />
</UsedUDXColumns>
<RelOp AvgRowSize="12983" EstimateCPU="0.0003" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="3000" LogicalOp="Compute Scalar" NodeId="6" Parallel="false" PhysicalOp="Compute Scalar" EstimatedTotalSubtreeCost="1.07284">
<OutputList>
<ColumnReference Column="Expr1020" />
<ColumnReference Table="[XML Reader]" Column="id" />
<ColumnReference Table="[XML Reader]" Column="nid" />
<ColumnReference Table="[XML Reader]" Column="tid" />
<ColumnReference Table="[XML Reader]" Column="value" />
<ColumnReference Table="[XML Reader]" Column="lvalue" />
<ColumnReference Table="[XML Reader]" Column="lvaluebin" />
</OutputList>
<ComputeScalar>
<DefinedValues>
<DefinedValue>
<ColumnReference Column="Expr1020" />
<ScalarOperator ScalarString="0x58">
<Const ConstValue="0x58" />
</ScalarOperator>
</DefinedValue>
</DefinedValues>
<RelOp AvgRowSize="12531" EstimateCPU="0.01254" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="3000" LogicalOp="Inner Join" NodeId="7" Parallel="false" PhysicalOp="Nested Loops" EstimatedTotalSubtreeCost="1.07254">
<OutputList>
<ColumnReference Table="[XML Reader]" Column="id" />
<ColumnReference Table="[XML Reader]" Column="nid" />
<ColumnReference Table="[XML Reader]" Column="tid" />
<ColumnReference Table="[XML Reader]" Column="value" />
<ColumnReference Table="[XML Reader]" Column="lvalue" />
<ColumnReference Table="[XML Reader]" Column="lvaluebin" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRows="11" Batches="0" ActualEndOfScans="1" ActualExecutions="1" ActualExecutionMode="Row" ActualElapsedms="0" ActualCPUms="0" />
</RunTimeInformation>
<NestedLoops Optimized="false">
<OuterReferences>
<ColumnReference Column="Expr1004" />
</OuterReferences>
<RelOp AvgRowSize="461" EstimateCPU="1.157E-06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="1" LogicalOp="Constant Scan" NodeId="8" Parallel="false" PhysicalOp="Constant Scan" EstimatedTotalSubtreeCost="1.157E-06">
<OutputList>
<ColumnReference Column="Expr1004" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRows="1" Batches="0" ActualEndOfScans="1" ActualExecutions="1" ActualExecutionMode="Row" ActualElapsedms="0" ActualCPUms="0" />
</RunTimeInformation>
<ConstantScan>
<Values>
<Row>
<ScalarOperator ScalarString="0x">
<Const ConstValue="0x" />
</ScalarOperator>
</Row>
</Values>
</ConstantScan>
</RelOp>
<RelOp AvgRowSize="12531" EstimateCPU="1.06" EstimateIO="0" EstimateRebinds="0" EstimateRewinds="0" EstimatedExecutionMode="Row" EstimateRows="3000" LogicalOp="Table-valued function" NodeId="9" Parallel="false" PhysicalOp="Table-valued function" EstimatedTotalSubtreeCost="1.06">
<OutputList>
<ColumnReference Table="[XML Reader]" Column="id" />
<ColumnReference Table="[XML Reader]" Column="nid" />
<ColumnReference Table="[XML Reader]" Column="tid" />
<ColumnReference Table="[XML Reader]" Column="value" />
<ColumnReference Table="[XML Reader]" Column="lvalue" />
<ColumnReference Table="[XML Reader]" Column="lvaluebin" />
</OutputList>
<RunTimeInformation>
<RunTimeCountersPerThread Thread="0" ActualRebinds="1" ActualRewinds="0" ActualRows="11" Batches="0" ActualEndOfScans="1" ActualExecutions="1" ActualExecutionMode="Row" ActualElapsedms="0" ActualCPUms="0" />
</RunTimeInformation>
<TableValuedFunction>
<DefinedValues>
<DefinedValue>
<ColumnReference Table="[XML Reader]" Column="id" />
</DefinedValue>
<DefinedValue>
<ColumnReference Table="[XML Reader]" Column="nid" />
</DefinedValue>
<DefinedValue>
<ColumnReference Table="[XML Reader]" Column="tid" />
</DefinedValue>
<DefinedValue>
<ColumnReference Table="[XML Reader]" Column="value" />
</DefinedValue>
<DefinedValue>
<ColumnReference Table="[XML Reader]" Column="lvalue" />
</DefinedValue>
<DefinedValue>
<ColumnReference Table="[XML Reader]" Column="lvaluebin" />
</DefinedValue>
</DefinedValues>
<Object Table="[XML Reader]" />
<ParameterList>
<ScalarOperator ScalarString="[Expr1003]">
<Identifier>
<ColumnReference Column="Expr1003" />
</Identifier>
</ScalarOperator>
<ScalarOperator ScalarString="(3)">
<Const ConstValue="(3)" />
</ScalarOperator>
<ScalarOperator ScalarString="[Expr1004]">
<Identifier>
<ColumnReference Column="Expr1004" />
</Identifier>
</ScalarOperator>
<ScalarOperator ScalarString="NULL">
<Const ConstValue="NULL" />
</ScalarOperator>
</ParameterList>
</TableValuedFunction>
</RelOp>
</NestedLoops>
</RelOp>
</ComputeScalar>
</RelOp>
</Extension>
</RelOp>
</StreamAggregate>
</RelOp>
</NestedLoops>
</RelOp>
</ComputeScalar>
</RelOp>
</QueryPlan>
</StmtSimple>
</Statements>
</Batch>
</BatchSequence>
</ShowPlanXML>


Владислав Колосов
а для чего такие сложности, чтобы склеить строки?


Да.

автор
Microsoft SQL Server 2016 (SP2-CU17) (KB5001092) - 13.0.5888.11 (X64) Mar 19 2021 19:41:38


Сообщение было отредактировано: 11 ноя 21, 08:56
11 ноя 21, 08:47    [22394519]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
PaulWist,

"агрегатная CLR функция для сбора колонки в строку с разделителями"
Вдруг пригодится.

+

/*
-- агрегатная CLR функция для сбора колонки в строку с разделителями
create table #tt1(id int, nn varchar(10))
insert #tt1 values (1, 'qwe'),(1,'qwe'),(1,'dsa'),(2,'zxc'),(3,'tre'),(3,'tre1')
select id, dbo.ConcatColumn(nn,' + ') from (select distinct * from #tt1) tt1 group by id
*/
using System;
using Microsoft.SqlServer.Server;
using System.Data.SqlTypes;
using System.IO;
using System.Text;

[Serializable]
[SqlUserDefinedAggregate(
Format.UserDefined, //use clr serialization to serialize the intermediate result
IsInvariantToNulls = true, //optimizer property
IsInvariantToDuplicates = false, //optimizer property
IsInvariantToOrder = false, //optimizer property
MaxByteSize = 8000) //maximum size in bytes of persisted value
]
public class ConcatColumn : IBinarySerialize
{
/// <summary>
/// The variable that holds the intermediate result of the concatenation
/// </summary>
private StringBuilder intermediateResult;
private string _delimiter;

/// <summary>
/// Initialize the internal data structures
/// </summary>
public void Init()
{
_delimiter = string.Empty;
intermediateResult = new StringBuilder();
}

/// <summary>
/// Accumulate the next value, not if the value is null
/// </summary>
/// <param name="Value"></param>
public void Accumulate(SqlString Value, SqlString Delimiter)
{
if (Value.IsNull)
{
return;
}

intermediateResult.Append(Value.Value);

if (!Delimiter.IsNull & Delimiter.Value.Length > 0)
{
_delimiter = Delimiter.Value; /// save for Merge
if (intermediateResult.Length > 0) intermediateResult.Append(Delimiter.Value);
}
}

/// <summary>
/// Merge the partially computed aggregate with this aggregate.
/// </summary>
/// <param name="other"></param>
public void Merge(ConcatColumn other)
{
if (intermediateResult.Length > 0 & other.intermediateResult.Length > 0)
intermediateResult.Append(_delimiter);

intermediateResult.Append(other.intermediateResult);
}

/// <summary>
/// Called at the end of aggregation, to return the results of the aggregation.
/// </summary>
/// <returns></returns>
public SqlString Terminate()
{
string output = string.Empty;

//delete the trailing comma, if any
if (intermediateResult != null
&& intermediateResult.Length > 0)
{
output = intermediateResult.ToString(0, intermediateResult.Length - _delimiter.Length);
}

return new SqlString(output);
}

public void Read(BinaryReader r)
{
_delimiter = r.ReadString();
intermediateResult = new StringBuilder(r.ReadString());
}

public void Write(BinaryWriter w)
{
w.Write(_delimiter);
w.Write(this.intermediateResult.ToString());
}
}
11 ноя 21, 13:06    [22394601]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
aleks222
Member

Откуда:
Сообщений: 1846
Владислав Колосов
PaulWist,
"агрегатная CLR функция для сбора колонки в строку с разделителями"
Вдруг пригодится.

Если есть выбор: "встроенная или CLR" - от CLR следует шарахаться как чорт от ладана.
11 ноя 21, 13:52    [22394625]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3104
так может пустая не нужна совсем, тогда еще проще
select cast(nullif([Name], '') as nvarchar) from #test FOR XML PATH('') 
11 ноя 21, 14:02    [22394631]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
aleks222
Владислав Колосов
PaulWist,
"агрегатная CLR функция для сбора колонки в строку с разделителями"
Вдруг пригодится.

Если есть выбор: "встроенная или CLR" - от CLR следует шарахаться как чорт от ладана.


Надо было еще палец к небу поднять.
11 ноя 21, 17:05    [22394724]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
L_argo
Member

Откуда:
Сообщений: 1552
автор
"агрегатная CLR функция для сбора колонки в строку с разделителями"
Шта ? Можно же сделать обычную скалярную sql-функцию.
11 ноя 21, 18:09    [22394769]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
msLex
Member

Откуда:
Сообщений: 9542
L_argo
Шта ? Можно же сделать обычную скалярную sql-функцию.

Вы разницу между скалярной и агрегатной функцией знаете?
11 ноя 21, 18:47    [22394781]     Ответить | Цитировать Сообщить модератору
 Re: Убрать "мусор"  [new]
PaulWist
Member

Откуда:
Сообщений: 2299
L_argo
автор
"агрегатная CLR функция для сбора колонки в строку с разделителями"
Шта ? Можно же сделать обычную скалярную sql-функцию.


Именно так поступило предыдущие "поколение кодо-писателей", а теперь оказалось, что ночь не такая уж долгая

Сообщение было отредактировано: 12 ноя 21, 08:03
12 ноя 21, 08:02    [22394904]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить