Usar el procedimiento de almacenamiento de SQL en Power BI

Un usuario Pregunto ✅

eferreira

Creé un procedimiento almacenado básico sin parámetros en SQL Server, cuando uso el procedimiento de almacenamiento en Power Bi Desktop, el retorno está bien en el diseño, pero cuando hago clic en Guardar y cerrar en la edición de la fuente de datos, Power Bi me da un mensaje de error como el siguiente: Estoy tratando de usar este procedimiento como consulta directa.

Microsoft SQL: sintaxis incorrecta cerca de la palabra clave ‘EJECUTAR’. Sintaxis incorrecta cerca ‘)’.

Intenté cambiar la declaración pero no obtuve nada.

La instrucción sql para ejecutar el procedimiento es:

EJECUTAR [Person].[SelectpersonByType]

Estoy usando el ejemplo de la base de datos AdventureWorks de Microsoft y mi declaración de procedimiento es:

CREAR PROCEDIMIENTO [Person].[SelectpersonByType]
COMO
COMENZAR
— Se agregó SET NOCOUNT ON para evitar conjuntos de resultados adicionales.
— interferir con las sentencias SELECT.
ESTABLECER SIN CUENTA EN;

— Inserte declaraciones para el procedimiento aquí
seleccione * de Persona.Persona
FIN

Mi cliente está probando Power BI y se enfrenta al mismo error, gracias de antemano.

DBekker

Openquery no funcionó para nosotros ya que tenemos un SP que utilizaba una tabla temporal.

pero hemos tenido cierto éxito al usar la opción «con conjuntos de resultados» de exec cuando surge ese problema.

por ejemplo

SELECT *
FROM OPENQUERY ("snapserver", 
'EXEC specialprojects.dbo.CFE_DASHBOARD_Summary_BugTrendX
WITH RESULT SETS
(
( [rel] nvarchar(16) NOT NULL,
  [value] int NOT NULL,
  [year] int NOT NULL,
  [series] nvarchar(16) NOT NULL,
  [sortorder] int NOT NULL
))') 

Esto parece funcionar sin problemas. No siempre es ideal, ya que requiere cambiar la definición del conjunto de resultados si la consulta cambia, pero como estos son informes bi, es probable que utilicen el mismo esquema de salida para la mayoría de las consultas.

la segunda mitad de esto es intentar que los parámetros funcionen.

Creo que esto funcionaría si se elimina la declaración de declaración. bi no parece gustarle cosas como declare o with a menos que sea parte del sql dinámico que no funcionará en este caso.

Supongo que la declaración de declaración se puede eliminar y @team se reemplaza con un parámetro bi. pero no lo he probado todavía.

declare @team nvarchar(max)= 'winet'
exec ('
SELECT *
FROM OPENQUERY ("snapserver", 
''EXEC specialprojects.dbo.CFE_DASHBOARD_Summary_BugTrendX @team='+@team+'
WITH RESULT SETS
(
( [rel] nvarchar(16) NOT NULL,
  [value] int NOT NULL,
  [year] int NOT NULL,
  [series] nvarchar(16) NOT NULL,
  [sortorder] int NOT NULL
))'')') 

JackSprat

En respuesta a DBekker

Gracias por esta respuesta. Intentaré esto hoy. Publiqué anteriormente, pero no debo haber presionado guardar o algo así. Gracias por la respuesta.

JackSprat

Este código se ejecuta según lo previsto en Desktop, pero falla en la nube de Power BI.

DECLARAR @CustomerNumberIDList dbo.IdList
Declarar @Success int

INSERTAR EN @CustomerNumberIDList
SELECCIONE ID de número de cliente distinto
DESDE [dbo].[vw_ReportSummary]

EJECUTIVO @Éxito=[dbo].[LogCustomerView] @CustomerNumberIDList

Si @Éxito=0
SELECCIONE *
DESDE
[dbo].[vw_ReportSummary]

Mi requisito es registrar los valores clave cada vez que se utiliza un cliente en un informe por razones de privacidad. La parte que hace el registro: ‘EJECUTIVO @Éxito=[dbo].[LogCustomerView] @CustomerNumberIDList‘ funciona de maravilla cada vez que actualizo el escritorio de Power BI, pero no registra los valores clave cuando ejecuto exactamente el mismo informe después de cargarlo en la nube. Sin embargo, todavía obtiene el conjunto de datos.

¿Alguna idea de por qué esa llamada para registrar las claves solo funciona en el escritorio?

nirajdubey

Es una respuesta tardía, pero puede ayudar a alguien más, puede usar openquery. La siguiente sintaxis funcionará tanto con datos de importación como con consultas directas

SELECCIONE *
DESDE OPENQUERY ([server name],
‘EXEC dbname.dbo.spname @parametername=»»R1»’);

Zak2815

En respuesta a nirajdubey

@nirajdubey, por mi vida no puedo hacer que esto funcione para el modo de consulta directa:

SELECCIONE *
DESDE OPENQUERY ([server name],
‘EXEC dbname.dbo.spname @parametername=»»R1»’);

He probado cada uno de estos a continuación:

SELECCIONE *
DESDE OPENQUERY ([server name],
‘EXEC dbname.dbo.spname @AsOfDate=»»GETDATE()»’);

SELECCIONE *
DESDE OPENQUERY ([server name],
‘EXEC dbname.dbo.spname @AsOfDate =
»16-03-2017 23:59:59» ‘);

SELECCIONE *
DESDE OPENQUERY ([server name],
‘EXEC dbname.dbo.spname @AsOfDate = CONVERT(DATETIME,»03-16-2017 23:59:59»,101) ‘);

Ninguno parece funcionar. Las veces que puedo obtener una vista previa cargada, siempre hay un error en «Aplicar».

Ayuda si alguien ha logrado llamar a un procedimiento almacenado en el modo de importación directa.

En respuesta a nirajdubey

@nirajdubey Gracias. Logré usar el SP de OpenQuery como lo introdujiste.

stangellapally

En respuesta a nirajdubey

Tengo un problema similar y probé las dos soluciones publicadas:

1. Intenté cambiar de consulta directa a importar, pero Power BI no me da esa opción para cambiar.

2. También probé la OPCIÓN OPENQUERY y ahora recibo el siguiente mensaje:

Detalles: «Microsoft SQL: el servidor ‘sv375002lt1201’ no está configurado para ACCESO A DATOS».

En respuesta a stangellapally

@stangellapally@eferreira@nirajdubey@asocorro Como continuación de mi publicación anterior, estaba probando esto más a fondo debido a otro hilo, y descubrí que no es necesario cambiar ninguna configuración de la base de datos ni usar OpenQuery. Si envuelve su procedimiento almacenado en una variable, puede importar los datos usando un sproc (no funciona en Direct Query, solo importa)

ejemplo:

DECLARAR @sqlCommand varchar(1000)

SET @sqlCommand = ‘dbo.Testproc’
EJECUTIVO (@sqlCommand)

batory666

En respuesta a Seth_C_Bauer

¡¡Muchas gracias!! funcion perfecto!

nirvana_moksh

En respuesta a Seth_C_Bauer

@Seth_C_Bauer

Sé que esta es una publicación anterior, pero ¿cuál es el uso/beneficio de usar:

DECLARAR @sqlCommand varchar(1000)

SET @sqlCommand = ‘dbo.Testproc’
EJECUTIVO (@sqlCommand)

Opuesto a un simple y simple:

EXEC ALMACENADO_PROCEDIMIENTO

En respuesta a nirvana_moksh

@nirvana_moksh En el momento de la publicación anterior, cuando ejecutó un procedimiento almacenado contra la base de datos en modo Consulta directa, fallaría. Esta solución hizo que funcionara, no lo he probado por un tiempo, así que no sé si ese comportamiento ha cambiado. Si usa «importar», entonces puede usar una declaración de ejecución directa.

nirvana_moksh

En respuesta a Seth_C_Bauer

@Seth_C_Bauer: ¡gracias por la respuesta, Seth!

prasad_chengti

En respuesta a Seth_C_Bauer

Hola,

Sé que esta publicación podría haberse cerrado ya que las soluciones proporcionadas aquí funcionan para muchos.

Sin embargo, cuando trato de seguir los mismos pasos obtengo diferentes tipos de errores.

Obtuvimos los datos de la base de datos remota (ORACLE) a través de VPN en Power BI usando el nombre del servidor y la cadena de conexión.

Usando la sintaxis mencionada a continuación, escribiendo la consulta en la sección Importar y llamando al procedimiento almacenado que se crea en la base de datos remota. Pero cuando intentamos ejecutar el informe, obtenemos el siguiente error. Para estar doblemente seguro de que el procedimiento almacenado no tiene un error de sintaxis o similar, ejecutó el mismo procedimiento en el desarrollador de sql y funciona como se esperaba. Cualquier ayuda o pista sobre esto es muy apreciada.

consulta1:

SELECCIONE *
DESDE OPENQUERY ([server name],
‘EXEC dbname.dbo.spname @parametername=»»R1»’);

Para la consulta anterior, el mensaje de error es:

Consulta2:

DECLARAR @sqlCommand varchar(1000) ==> DECLARAR @Variable varchar(1000)

SET @sqlCommand = ‘dbo.Testproc’ ==> SET @Variable = ‘dbo.nid_poc_test1’
EJECUTIVO (@sqlCommand) ==> EJECUTIVO (@variable)

Para esta consulta, el mensaje de error es:

No puede conectarse

Encontramos un error al intentar conectarnos.

Detalles: «Oracle: ORA-06550: línea 3, columna 5: PLS-00488: ‘variable’ debe ser un tipo ORA-06550: línea 3, columna 5:
PL/SQL: elemento ignorado
ORA-06550: línea 5, columna 1:
PLS-00221: ‘variable’ no es un procedimiento o no está definida

ORA-06550: línea 5, columna 1:
PL/SQL: «Declaración ignorada»

error2 mientras usa punto y coma al final:

DECLARAR @Variable varchar(1000);

SET @Variable = ‘dbo.nid_poc_test1’;

EJECUTIVO (@variable);

Aquí la VPN está muy conectada y el procedimiento almacenado funcionaba bastante bien en la base de datos remota. También hemos intentado dar tiempo de espera al comando en Power BI.

sfiros2003

En respuesta a Seth_C_Bauer

Es muy útil, gracias a todos.

Mi pregunta es cómo pasar el valor del parámetro de una lista o informe según alguna selección (sin codificación fija en la consulta).

premjitsaha

En respuesta a Seth_C_Bauer

¿Cómo usarlo si el procedimiento almacenado SQl tiene un parámetro?

En respuesta a premjitsaha

@premjitsaha Utilice la solución anterior de @dsilveira… ¿Hay algún escenario diferente en el que no esté funcionando?

premjitsaha

En respuesta a Seth_C_Bauer

gracias funciono

radz

En respuesta a Seth_C_Bauer

@Seth_C_Bauer Hola, muchas gracias por tu solución. ¡Funciona!

Pero una consulta que sigue a esto es para «Pasar parámetros dentro de un procedimiento almacenado (por ejemplo, en SQL) para que los valores de los parámetros se puedan llamar/usar en parámetros hechos en Power BI(consulta) ?»

Por ejemplo: tengo un SP en SQL que tiene 2 parámetros (para 1 y para2) que pueden tomar valores múltiples/únicos.

Llamo a este SP en Power BI Query Editor (como mencionaste) y ahora puedo verlo en mis conjuntos de datos.

Lo que quiero es crear un parámetro (digamos para) en Power BI que tenga su fuente como el SP en SQL, de modo que si paso un valor a para (en Power BI), entonces los datos se cargan desde SQL Server (mis datos fuente) en Power BI corresponde solo a los valores que agregué.

es posible?

¡Gracias por adelantado!

[This may help in getting required data loaded only into Power BI, saving time.]

En respuesta a radz

@radz Todavía no he descubierto una manera de hacer esto, pero creo que sería posible

dsilveira

En respuesta a Seth_C_Bauer

@radz

Hola, tuve el mismo problema y encontre una manera de usar los parametros

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'sp_name'
EXEC @sqlCommand @Parameter1= 39, @Parameter2= 'myString', @Parameter3 = 'myString2'

Espero que ayude a alguien.

Saludos.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *