Eu tenho uma tabela de banco de dados SQL Server que contém valores separados por vírgulas em muitas colunas. Por exemplo:
eu ia | Coluna B | coluna c |
---|---|---|
1 | abc, | 1,2,3, |
2 | d, ,f, | 4,5,6, |
3 | g,h,eu,j, | 7, ,9,8, |
Quero dividir todas as colunas em linhas e a saída deve ser esta:
eu ia | Coluna B | coluna c |
---|---|---|
1 | a | 1 |
1 | b | 2 |
1 | c | 3 |
2 | d | 4 |
2 | 5 | |
2 | f | 6 |
3 | g | 7 |
3 | h | |
3 | eu | 9 |
3 | j | 8 |
Acabei de dar a ideia de como convertê-las em linhas, mas minhas colunas reais têm mais de 30 e precisam ser separadas por vírgula.
violino
Nesse caso, sua versão do SQL Server não é real. Veja o comentário de @Luuk .
violino
Mas esta consulta não é determinística.
Ter listas delimitadas por vírgulas no banco de dados é um antipadrão e ter várias listas delimitadas por vírgulas que precisam ser correlacionadas com base na ordem da lista é um enorme antipadrão.
Isso é algo que deveria ser representado em uma tabela diferente.
Esperamos que o objetivo desta consulta seja fazer isso. Algumas alternativas....
OPENJSON
Como o ordinal to
STRING_SPLIT
aparentemente não está disponível para você - você pode usá-loOPENJSON
como alternativa.O procedimento abaixo funcionará para o SQL Server 2016+ (e você deve estar pelo menos nisso, pois não tem
STRING_SPLIT
ordinal).Pode ser necessário adicionar código para escapar caracteres
b
ec
se você descobrir que eles contêm caracteres que levam à construção de matrizes JSON inválidas.CTE recursivo
Se você tivesse que lidar com muitas dessas colunas, poderia até considerar uma abordagem CTE recursiva . Isso adiciona alguma sobrecarga em relação a outras abordagens, mas permite que você faça várias colunas por iteração e evita qualquer necessidade de agrupá-las ou juntá-las por ordinal posteriormente.
db<> violino ?