Eu estou olhando para dividir '1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 ...' (delimitado por vírgula) em uma tabela ou variável de tabela .
Alguém tem uma função que retorna cada um em uma linha?
sql
sql-server
tsql
sql-server-2008
jinsungy
fonte
fonte
Respostas:
Aqui está uma solução um tanto antiquada:
No SQL Server 2008, você pode obter o mesmo com o código .NET. Talvez funcione mais rápido, mas definitivamente essa abordagem é mais fácil de gerenciar.
fonte
Tente isto
OU
Muitas outras maneiras de fazer o mesmo estão aqui Como dividir uma string delimitada por vírgula?
fonte
<
,>
ou&
(por exemplo, entrada é uma sequência de números inteiros). Qualquer um dos três caracteres acima fará com que você obtenha um erro de análise em vez do resultado esperado.SELECT b, CHARINDEX(@delimiter, @str, b) + LEN(@delimiter)
deve realmente serSELECT b, CHARINDEX(@delimiter, @str, b+1) + LEN(@delimiter)
. O b + 1 faz uma grande diferença. Testado aqui com espaço como delimitador, não funcionou sem essa correção.MAXRECURSION
opção para dividir mais de 100 partes, substituirLEN
por algo de stackoverflow.com/q/2025585 para manipular espaços e excluirNULL
linhas paraNULL
entradas.Você marcou este SQL Server 2008, mas é provável que os futuros visitantes desta pergunta (usando o SQL Server 2016 ou superior) desejem conhecer
STRING_SPLIT
.Com esta nova função integrada, agora você pode apenas usar
Algumas restrições dessa função e alguns resultados promissores de teste de desempenho estão neste post de Aaron Bertrand .
fonte
Isso é mais parecido com o .NET, para aqueles que estão familiarizados com essa função:
fonte
aqui está a função de divisão que você pediu
execute a função assim
fonte
Origem desta resposta: http://sqlhint.com/sqlserver/how-to/best-split-function-tsql-delimited
fonte
Estou tentado a apertar minha solução favorita. A tabela resultante será composta por 2 colunas: PosIdx para a posição do número inteiro encontrado; e Valor em número inteiro.
Ele funciona usando CTE recursiva como a lista de posições, de 1 a 100 por padrão. Se você precisar trabalhar com uma string maior que 100, chame esta função usando 'option (maxrecursion 4000)' como o seguinte:
fonte
uso
fonte
Este CTE simples fornecerá o que é necessário:
fonte
Esta é outra versão que realmente não possui restrições (por exemplo: caracteres especiais ao usar a abordagem xml, número de registros na abordagem CTE) e é executada muito mais rapidamente com base em um teste em mais de 10 milhões de registros com comprimento médio de cadeia de origem de 4000. Espero que isso Poderia ajudar.
fonte
Usando a tabela registro aqui é uma função string split (melhor abordagem possível) por Jeff Moden
Referido de Tally OH! Uma função aprimorada de “CSV Splitter” do SQL 8K
fonte
Este blog veio com uma solução muito boa usando XML em T-SQL.
Esta é a função que criei com base nesse blog (altere o nome da função e o tipo de resultado convertido por necessidade):
fonte
fonte
fonte
Você escreve esta função no servidor sql após a solução do problema.
http://csharpdotnetsol.blogspot.in/2013/12/csv-function-in-sql-server-for-divide.html
fonte