He creado con éxito muchas conexiones en un archivo de Excel a una base de datos, por lo que el problema está directamente relacionado solo con este escenario en particular. El servidor es 2012, Excel es 2013.

Tengo el siguiente SP:

IF OBJECT_ID('usp_LockUnlockCustomer', 'P') IS NOT NULL
    DROP PROCEDURE usp_LockUnlockCustomer
GO
CREATE PROCEDURE usp_LockUnlockCustomer 
    @Lock AS CHAR(10), @Id AS nvarchar(50), @LockedBy AS nvarchar(50)=null
AS BEGIN
SET NOCOUNT ON;
IF @Lock = 'Lock'
    INSERT INTO IO_Call_DB..IdLock (Id, LockedBy, LockedDtTm)
    VALUES(@Id,@LockedBy,GETDATE())
;
IF @Lock = 'Unlock'
    DELETE FROM IO_Call_DB..IdLock
    WHERE Id = @Id
;
END;
--EXEC usp_LockUnlockCustomer 'Lock','123456789', 'Test User'

El SP anterior se llama a través de algunos VBA de la siguiente manera:

With ActiveWorkbook.Connections("usp_LockUnlockCustomer").OLEDBConnection
    .CommandText = "EXECUTE dbo.usp_LockUnlockCustomer '" & bLock & "','" & Id & "','" & LockedBy & "'"
End With

He probado la cadena y la cadena tiene el formato correcto y contiene todos los datos requeridos.

La conexión entre Excel y SQL se crea a través de "Datos> De otras fuentes> Desde SQL Server", es un proceso bastante estándar que ha funcionado para todos los demás SP y consultas generales.

Creo que, debido a que esta conexión no devuelve datos a Excel (solo configuro la conexión en lugar de especificar que Excel debe devolver datos a una celda), este puede ser el problema.

¿Alguien ha experimentado este problema antes?

EDIT1: He resuelto el problema, pero no es un resultado particularmente bueno. Un poco de ayuda sería apreciada. Para resolver el problema, debe incluir un proceso de "seleccionar * de" al final del procedimiento almacenado y también decirle a Excel que envíe los datos a un rango dentro del libro. Esto permite que la parte .Refresh del VBA haga lo que haga y envíe el SP a SQL.

Esencialmente, se ve obligado a crear una tabla de datos, pero no quiero ningún dato, solo quiero enviar un comando.

Entonces, ¿cómo enviar un comando y no hacer que Excel requiera que 1) indique explícitamente dónde deben colocarse los datos 2) incluya una declaración SELECT dentro del procedimiento almacenado cuando no requiera que se devuelvan datos.

Mi solución fue "seleccionar los primeros 0" de la tabla, al menos de esa manera la tabla de datos que se envía a Excel no crecerá.

0
Dan 14 dic. 2016 a las 18:24

2 respuestas

La mejor respuesta

El problema que tengo es que simplemente creando la conexión sin especificar una celda a la que devolver datos, no sucede nada.

Además, si especifico una celda a la que devolver datos, no sucede nada a menos que use mi 'solución', que es crear una tabla vacía al final del SP.

0
Dan 16 dic. 2016 a las 09:52