Trucos de Tabular Editor – Convertir a Legacy

Este contenido fue traducido mediante IA y no ha sido revisado por un editor humano. Las imágenes y los gráficos permanecen en su idioma original.
IMPORTANTE

La información de este artículo se refiere específicamente a Tabular Editor 2 cuando se implementan modelos semánticos en SQL Server Analysis Services (SSAS) o Azure Analysis Services (AAS). No recomendamos el uso de orígenes de datos heredados (proveedor) con Power BI / Fabric.

 

Convertir particiones de M a Legacy

Al crear modelos tabulares de Analysis Services sobre un Data Warehouse o Data Mart en una base de datos relacional, recomiendo usar las Data sources Legacy (Provider) en lugar de las Data sources de Power Query disponibles a partir de SQL Server 2017. Por desgracia, las Data sources de Power Query se han convertido en la opción predeterminada en SSDT, y crear Data sources Legacy se ha vuelto bastante complicado (en resumen, marca “Habilitar Data sources Legacy” en Opciones > Analysis Services Tabular > Importación de datos).

Hay un par de razones por las que prefiero las Data sources Legacy:

  • El rendimiento de actualización es similar, pero en mi experiencia las Data sources de Power Query tienen un pequeño sobrecoste de inicialización, que puede ser molesto si necesitas hacer muchas actualizaciones pequeñas y frecuentes.
  • De todos modos, no quieres hacer ninguna transformación M en las consultas de partición de tu modelo tabular: para eso existe un proceso ETL que carga los datos en un esquema en estrella en el origen relacional.
  • Al desplegar un modelo o ejecutar un script TMSL CreateOrReplace, no se eliminan las credenciales usadas por las Data sources Legacy.
  • Puedes usar el práctico asistente Importar tabla de Tabular Editor

Si ya creaste tu modelo usando una Data source de Power Query y particiones M, estos son los pasos que debes seguir para cambiar a Legacy:

  1. Crea una Data source Legacy en tu modelo y apúntala a tu base de datos relacional. Asígnale un nombre, por ejemplo, “SQLDW”.
  2. Pega el siguiente script en la pestaña de Scripting avanzado de Tabular Editor: var legacy = (Model.DataSources["SQLDW"] as ProviderDataSource); foreach(var table in Model.Tables) { if(table is CalculatedTable || table is CalculationGroupTable) continue; table.Partitions.ConvertToLegacy(legacy); // foreach(var partition in table.Partitions) partition.Query = "SELECT * FROM " + table.Name; }
  3. Antes de ejecutar el script, ajusta el nombre de la Data source en la línea 1 si le has dado un nombre distinto a la nueva Data source Legacy.
  4. (Opcional) Si los nombres de las tablas importadas en tu modelo coinciden con los nombres de tablas o vistas en tu Data source, puedes descomentar la línea 7 para establecer automáticamente la consulta de cada partición en una consulta básica SELECT * FROM <nombre de tabla/vista>.
  5. Ejecuta el script
  6. Revisa cada partición de tu modelo para verificar que la partición es del tipo correcto (Legacy) y que está usando la Data source adecuada. Si te saltaste el paso 4, asegúrate también de introducir la consulta SQL correcta en cada partición: SQL query on partition
  7. Elimina tu Data source de Power Query, que ahora ya no debería estar en uso en ninguna partición de tu modelo.

Y eso es todo: ahora todas las particiones de tu modelo son particiones Legacy al 100 %.

Letra pequeña

Actualización (agosto de 2020): Había un error en el script original si descomentabas la línea 7, ya que el bucle iteraba por ALL las tablas del modelo, incluidas las tablas calculadas y las tablas de grupo de cálculo. Establecer la expresión DAX de una tabla calculada en “SELECT * FROM …” probablemente no es lo que quieres y, si tu modelo contenía una tabla de grupo de cálculo, el script fallaría directamente. Esto se debe a que la propiedad Query no es compatible con las particiones de una tabla de grupo de cálculo. Añadí la comprobación en la línea 5 para omitir cualquier tabla calculada o tabla de grupo de cálculo del modelo.

El método Partitions.ConvertToLegacy(<data source>), llamado por el script, reemplaza cada partición M de una tabla por una partición Legacy que apunta a la Data source (Legacy) especificada. También asigna la expresión M de la partición M original a la propiedad “Query” de la nueva partición Legacy creada, lo cual, por supuesto, no tiene sentido, ya que las Data sources Legacy no entienden consultas M. Por eso deberías revisar cada partición para actualizar la consulta manualmente, o usar el paso opcional 4, siempre que las tablas/vistas de origen tengan los mismos nombres que las tablas importadas.

También puedes plantearte modificar la línea 7 del script para construir de otra forma la consulta de la partición Legacy, y así ahorrarte el trabajo manual de repasar cada consulta de partición. Pero esto asume que tienes cierta coherencia en cómo se han nombrado las tablas y/o particiones dentro de tu modelo:

foreach(var partition in table.Partitions) partition.Query = "SELECT * FROM [tabular].[vw_" + partition.Name + "]";

Este ejemplo usa los nombres de las particiones para construir la consulta. Así que, si tienes una partición ResellerSalesFY2019 en tu modelo, la consulta pasaría a ser: SELECT * FROM [tabular].[vw_ResellerSalesFY2019]

Por último, si no te da reparo hacer algo de manipulación de cadenas con C#, probablemente podrías “parsear” la expresión M original para extraer el nombre del esquema y de la tabla usados dentro de la consulta, pero eso queda fuera del alcance de este post.

Related articles