{"id":2242,"date":"2020-11-01T21:56:47","date_gmt":"2020-11-01T21:56:47","guid":{"rendered":"http:\/\/manualsqlserver.com\/?p=2242"},"modified":"2020-11-01T21:56:48","modified_gmt":"2020-11-01T21:56:48","slug":"funcion-string_split-sql-server","status":"publish","type":"post","link":"https:\/\/manualsqlserver.com\/?p=2242","title":{"rendered":"Funci\u00f3n String_split SQL Server"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"220\" height=\"260\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit__D.png\" alt=\"\" class=\"wp-image-2243\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Usando la Funci\u00f3n String_split<\/h2>\n\n\n\n<p>Microsoft SQL Server en la versi\u00f3n 2017 ha inclu\u00eddo algunas funciones interesantes para el manejo de cadenas de texto, una de ellas es la funci\u00f3n String_agg, la que permit\u00eda convertir un conjunto de valores de cadena a una cadena separada por un caracter. En este art\u00edculo se explica como se usa la funci\u00f3n String_Split que hace lo inverso de la funci\u00f3n String_agg.<br><a rel=\"noreferrer noopener\" href=\"https:\/\/manualsqlserver.com\/?p=1863\" target=\"_blank\">Ver Funci\u00f3n String_agg<\/a><\/p>\n\n\n\n<!--more-->\n\n\n\n<p class=\"has-medium-font-size\"><strong>Nivel de compatibilidad necesario<\/strong><\/p>\n\n\n\n<p>Para poder usar la funci\u00f3n String_split es necesario el nivel de compatibilidad m\u00ednimo de 130, que corresponde a SQL Server 2016.<br><a href=\"https:\/\/manualsqlserver.com\/?p=1839\" target=\"_blank\" rel=\"noreferrer noopener\">Ver Compatibilidad de base de datos en SQL Server<\/a><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Funci\u00f3n String_split<\/strong><\/p>\n\n\n\n<p>Es una funci\u00f3n de valor de tabla que separa una cadena de caracteres en partes basado en un separador.<\/p>\n\n\n\n<p><strong>Sintaxis<\/strong><br>String_split(Cadena, Separador)<br>Donde<br><strong>Cadena<\/strong><br>Es la cadena de caracteres a separar<br><strong>Separador<\/strong><br>Caracter que se usa como base para separar. El caracter es simple y puede ser nvarchar(1), varchar(1), nchar(1) o char(1)<\/p>\n\n\n\n<p><strong>La imagen ilustra el resultado de la funci\u00f3n String_split<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_01.png\" alt=\"\" class=\"wp-image-2244\" width=\"763\" height=\"501\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_01.png 726w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_01-300x197.png 300w\" sizes=\"auto, (max-width: 763px) 100vw, 763px\" \/><\/figure>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:24px\"><strong>Ejercicios<\/strong><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 1<\/strong><\/p>\n\n\n\n<p><strong>Convertir los nombres en un valor de columna<\/strong><br>Declare @Personal nvarchar(100) = &#8216;Carolina, Maria Fernanda, Aracely, Esmeralda, Rossana, Silvia&#8217;<br>Select value from String_split(Replace(@Personal,&#8217;, &#8216;,&#8217;,&#8217;),&#8217;,&#8217;) As Personas<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_02.png\" alt=\"\" class=\"wp-image-2245\" width=\"363\" height=\"376\"\/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 2<\/strong><\/p>\n\n\n\n<p><strong>Convertir los Productos en un valor de columna<\/strong><br>Declare @Productos nvarchar(100) = &#8216;Monitor, Teclado, Mouse, Disco duro, Impresora, UPS, Scanner&#8217;<br>Select value from String_split(Replace(@Productos,&#8217;, &#8216;,&#8217;,&#8217;),&#8217;,&#8217;)<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_03.png\" alt=\"\" class=\"wp-image-2246\" width=\"327\" height=\"461\"\/><\/figure>\n\n\n\n<p><strong>Usando la base de datos Northwind<\/strong><br>use Northwind<br>go<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 3<\/strong><\/p>\n\n\n\n<p>Crear una vista con las categor\u00edas y sus productos separados por coma. Esta vista se va a usar para luego presentar los productos de cada una de las categor\u00edas como una columna.<\/p>\n\n\n\n<p>Create view vistaCategoriasProductosComa<br>As<br>select C.CategoryID As &#8216;C\u00f3digo&#8217;,<br>C.CategoryName As &#8216;Categor\u00eda&#8217;,<br>Productos = STRING_AGG(P.ProductName,&#8217;,&#8217;)<br>within group (order by P.ProductName asc)<br>from Categories As C<br>join Products As P on C.CategoryID = P.CategoryID<br>group by C.CategoryID, C.CategoryName<br>go<\/p>\n\n\n\n<p><strong>Los registros en la vista<\/strong><br>select * from vistaCategoriasProductosComa<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_04.png\" alt=\"\" class=\"wp-image-2247\" width=\"738\" height=\"246\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_04.png 1009w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_04-300x100.png 300w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_04-768x257.png 768w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_04-795x266.png 795w\" sizes=\"auto, (max-width: 738px) 100vw, 738px\" \/><\/figure>\n\n\n\n<p>Ahora vamos a separar los productos cada uno en filas.<\/p>\n\n\n\n<p>select V.C\u00f3digo, V.Categor\u00eda, value As Producto<br>from vistaCategoriasProductosComa As V<br>cross apply string_split(V.Productos,&#8217;,&#8217;)<br>go<br><strong><a rel=\"noreferrer noopener\" href=\"https:\/\/manualsqlserver.com\/?p=2229\" target=\"_blank\">Ver Cross Apply en SQL Server<\/a><\/strong><br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_05.png\" alt=\"\" class=\"wp-image-2248\" width=\"614\" height=\"997\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_05.png 481w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_05-185x300.png 185w\" sizes=\"auto, (max-width: 614px) 100vw, 614px\" \/><\/figure>\n\n\n\n<p><strong>Obtener solamente los productos<\/strong><br>select value As Producto<br>from vistaCategoriasProductosComa As V<br>cross apply string_split(V.Productos,&#8217;,&#8217;)<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_06.png\" alt=\"\" class=\"wp-image-2249\" width=\"462\" height=\"1103\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_06.png 327w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_06-126x300.png 126w\" sizes=\"auto, (max-width: 462px) 100vw, 462px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Ordenamiento de los valores<\/strong><\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\" style=\"font-size:18px\"><strong>Al aplicar el ordenamiento de valores obtenidos de una cadena separada por coma, debe considerar que a partir del segundo valor puede contener un espacio en blanco, se debe eliminar el espacio en blanco usando la funci\u00f3n Replace para reemplazar los caracteres &#8216;, &#8216; (coma y espacio) por solamente la coma.<\/strong><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 4<\/strong><\/p>\n\n\n\n<p><strong>Listar los productos ordenados en forma ascendente.<\/strong><br>Declare @Productos nvarchar(100) = &#8216;Monitor, Teclado, Mouse, Disco duro, Impresora, UPS, Scanner&#8217;<br>Select rtrim(value) As Productos from String_split(Replace(@Productos,&#8217;, &#8216;,&#8217;,&#8217;),&#8217;,&#8217;)<br>order by value<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_07.png\" alt=\"\" class=\"wp-image-2250\" width=\"319\" height=\"455\"\/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Filtrando los valores<\/strong><\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\" style=\"font-size:18px\"><strong>Para realizar el filtrado de los valores usando el campo con los valores a separar, se usar la palabra reservada Value para hacer referencia al conjunto de valores.<\/strong><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 5<\/strong><\/p>\n\n\n\n<p>Para mostrar los productos que inician con la letra M.<br>Declare @Productos nvarchar(100) = &#8216;Monitor, Teclado, Mouse, Disco duro, Impresora, UPS, Scanner&#8217;<br>Select rtrim(value) from String_split(Replace(@Productos,&#8217;, &#8216;,&#8217;,&#8217;),&#8217;,&#8217;)<br>where Upper(value) like &#8216;M%&#8217;<br>order by value<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_08.png\" alt=\"\" class=\"wp-image-2251\" width=\"425\" height=\"300\"\/><\/figure>\n\n\n\n<script async src=\"\/\/pagead2.googlesyndication.com\/pagead\/js\/adsbygoogle.js\"><\/script>\n<ins class=\"adsbygoogle\"\n     style=\"display:block; text-align:center;\"\n     data-ad-layout=\"in-article\"\n     data-ad-format=\"fluid\"\n     data-ad-client=\"ca-pub-2636008503986218\"\n     data-ad-slot=\"1902193434\"><\/ins>\n<script>\n     (adsbygoogle = window.adsbygoogle || []).push({});\n<\/script>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 6<\/strong><\/p>\n\n\n\n<p><strong>Mostrar los productos que inician con las letras C, F y M<\/strong><br>select V.C\u00f3digo, V.Categor\u00eda, value As Producto<br>from vistaCategoriasProductosComa As V<br>cross apply string_split(V.Productos,&#8217;,&#8217;)<br>where upper(value) like &#8216;C%&#8217; or upper(value) like &#8216;F%&#8217; or<br>upper(value) like &#8216;M%&#8217;<br>Order by value<br>go<br><a href=\"https:\/\/manualsqlserver.com\/?p=2229\" target=\"_blank\" rel=\"noreferrer noopener\">Ver Cross Apply en SQL Server<\/a><br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_09.png\" alt=\"\" class=\"wp-image-2252\" width=\"642\" height=\"651\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_09.png 496w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_09-296x300.png 296w\" sizes=\"auto, (max-width: 642px) 100vw, 642px\" \/><\/figure>\n\n\n\n<p class=\"has-medium-font-size\"><strong>Evitando valores en blanco<\/strong><\/p>\n\n\n\n<p class=\"has-pale-cyan-blue-background-color has-background\" style=\"font-size:18px\"><strong>Al generar la lista de valores puede que algunos de ellos no tengan datos, puede evitarse posiblemente de acuerdo a las reglas de negocio usando restriciones de tipo Default.<br><a href=\"https:\/\/manualsqlserver.com\/?p=1499\" target=\"_blank\" rel=\"noreferrer noopener\">Ver Usando Restricciones en SQL Server<\/a><\/strong><\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 7<\/strong><\/p>\n\n\n\n<p><strong>Listado de productos, algunos con valores en blanco.<\/strong><br>Declare @Productos nvarchar(100) = &#8216;Monitor, Teclado, , , Mouse, Disco duro, , , Impresora, UPS, Scanner&#8217;<br>Select rtrim(value) from String_split(Replace(@Productos,&#8217;, &#8216;,&#8217;,&#8217;),&#8217;,&#8217;)<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_10.png\" alt=\"\" class=\"wp-image-2253\" width=\"289\" height=\"499\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_10.png 225w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_10-174x300.png 174w\" sizes=\"auto, (max-width: 289px) 100vw, 289px\" \/><\/figure>\n\n\n\n<p><strong>Evitando los valores en blanco.<\/strong><br>Declare @Productos nvarchar(100) = &#8216;Monitor, Teclado, , , Mouse, Disco duro, , , Impresora, UPS, Scanner&#8217;<br>Select rtrim(value) from String_split(Replace(@Productos,&#8217;, &#8216;,&#8217;,&#8217;),&#8217;,&#8217;)<br>where RTRIM(value) &lt;> \u00bb<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_11.png\" alt=\"\" class=\"wp-image-2254\" width=\"272\" height=\"373\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_11.png 225w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_11-218x300.png 218w\" sizes=\"auto, (max-width: 272px) 100vw, 272px\" \/><\/figure>\n\n\n\n<p style=\"font-size:22px\"><strong>Generar una tabla con los valores obtenidos con String_Split<\/strong><\/p>\n\n\n\n<p>Se puede usar la opci\u00f3n Into de la instrucci\u00f3n Select para generar una tabla con los valores obtenidos usando String_split<\/p>\n\n\n\n<p style=\"font-size:22px\"><strong>Ejercicio 8<\/strong><\/p>\n\n\n\n<p><strong>Crear una tabla con los productos de la categor\u00eda 3, usando la vista creada en el ejercicio 3.<\/strong><br>select value As Producto<br>into ProductosCategoria3<br>from vistaCategoriasProductosComa As V<br>cross apply string_split(V.Productos,&#8217;,&#8217;)<br>where v.C\u00f3digo = 3<br>go<br>Ver los productos<br>select * from ProductosCategoria3<br>go<br>El resultado se muestra en la siguiente imagen<\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_12.png\" alt=\"\" class=\"wp-image-2255\" width=\"430\" height=\"606\" srcset=\"https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_12.png 298w, https:\/\/manualsqlserver.com\/wp-content\/uploads\/2020\/11\/ManualSQL_FuncionStringSplit_12-213x300.png 213w\" sizes=\"auto, (max-width: 430px) 100vw, 430px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Usando la Funci\u00f3n String_split Microsoft SQL Server en la versi\u00f3n 2017 ha inclu\u00eddo algunas funciones interesantes para el manejo de cadenas de texto, una de ellas es la funci\u00f3n String_agg, la que permit\u00eda convertir un conjunto de valores de cadena a una cadena separada por un caracter. En este art\u00edculo se explica como se usa &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/manualsqlserver.com\/?p=2242\">Seguir leyendo<\/a><\/p>\n","protected":false},"author":1,"featured_media":2243,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6,231],"tags":[257,201,259],"class_list":["post-2242","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-funcionessql","category-subconsultas","tag-cross-apply","tag-string_agg","tag-string_split","nodate","item-wrap"],"_links":{"self":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2242","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2242"}],"version-history":[{"count":1,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2242\/revisions"}],"predecessor-version":[{"id":2256,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/posts\/2242\/revisions\/2256"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=\/wp\/v2\/media\/2243"}],"wp:attachment":[{"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2242"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2242"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/manualsqlserver.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2242"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}