Ho questo codice MSSQL SQLCMD, che può accedere al database e in thisjust fare una dichiarazione SELECT:modo più intelligente per utilizzare SQLCMD con dinamica chiamando
:CONNECT czasql-001
SELECT * FROM [Lps_Hepper_Cz].[config].[LpsPlant]
GO
:CONNECT LS_Hepper_DK
SELECT * FROM [LPS_Hepper_NY].[config].[LpsPlant]
:CONNECT LS_Hepper_DK
SELECT * FROM [LPS_Hepper_DK].[config].[LpsPlant]
:CONNECT LS_Hepper_DK
SELECT * FROM [LPS_Hepper_SUPPLIER].[config].[LpsPlant]
GO
:CONNECT LS_Hepper_372
SELECT * FROM [LPS_Hepper_MO].[config].[LpsPlant]
GO
:CONNECT LS_Hepper_678
SELECT * FROM [LPS_Hepper_678].[config].[LpsPlant]
GO
Questa soluzione funziona bene, ma mi richiede di copiare incollare il copia più volte per cambiare il nome del database. Ma qualcuno può aiutarmi a migliorare questo usando invece un ciclo. Ho provato usando una tabella temporanea. In questo modo:
declare @tbl table (ServerName nvarchar(50), DbName nvarchar(50), IsDone bit default(0))
insert into @tbl (ServerName,DbName) VALUES ('CZASQL-001', '[Lps_Hepper_CZ]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_DK', '[Lps_Hepper_DK]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_DK', '[Lps_Hepper_NY]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_DK', '[Lps_Hepper_Supplier]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_372', '[Lps_Hepper_MO]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_678', '[Lps_Hepper_678]')
Ma Non riesco a capire per fare la logica per iterate attraverso il database di connettersi al server e impostare il nome del database, quando i dati che ho è come un nvarchar? Qualcuno ha un suggerimento?
UPDATE: Lo userò solo per INSERT/UPDATE o DELETE. Quindi non sto usando una procedura memorizzata. Mi piace usare questo per aggiornare i dati su tutti i nostri database. Ecco perché userò solo la tabella temporanea che dovrebbe far parte dello script.
I nomi dei nomi dei server e dei database verranno dalla tabella temporanea in alto. I nomi delle tabelle sono gli stessi su tutti i database, poiché abbiamo copie del database in tutto il mondo per limitare il download dei dati, necessario per assicurarmi che quando aggiorno uno, aggiorni anche il resto.
Aggiornamento 2: ho cercato di giocare con essa, ma continuo stallo, con il non essere in grado di utilizzare i valori nella tabella temporanea. Il che significa che non posso usare il: SETVAR per impostare il nome del server:
declare @tbl table (ServerName nvarchar(50), DbName nvarchar(50), IsDone bit default(0))
insert into @tbl (ServerName,DbName) VALUES ('CZASQL-001', '[Lps_Hepper_CZ]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_DK', '[Lps_Hepper_DK]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_DK', '[Lps_Hepper_NY]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_DK', '[Lps_Hepper_Supplier]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_372', '[Lps_Hepper_MO]')
insert into @tbl (ServerName,DbName) VALUES ('LS_Hepper_678', '[Lps_Hepper_678]')
WHILE (SELECT COUNT(*) FROM @tbl WHERE IsDone = 0) > 0
BEGIN
DECLARE @selectedRow INT = (SELECT TOP 1 Id FROM @tbl WHERE IsDone = 0)
--DECLARE @ServerName NVARCHAR(50)= (SELECT ServerName FROM @tbl WHERE Id = @selectedRow)
--DECLARE @DatabaseName NVARCHAR(50) = (SELECT DbName FROM @tbl WHERE Id = @selectedRow)
DECLARE @ServerName sysname= (SELECT ServerName FROM @tbl WHERE Id = @selectedRow)
DECLARE @DatabaseName sysname = (SELECT DbName FROM @tbl WHERE Id = @selectedRow)
:SETVAR DatabaseName @DatabaseName
:SETVAR ServerName @ServerName
SELECT ServerName --This looks correctly
print CONVERT(NVARCHAR(100),@selectedRow)
:CONNECT ServerName
USE @DatabaseName
GO
SELECT * FROM [config].[LpsPlant]
GO
UPDATE @tbl SET IsDone = 1 WHERE Id = @selectedRow
END;
Provare a chiamare 'sqlcmd' da Powershell. PS ha l'istruzione 'foreach' http://sqlvariant.com/2011/01/powershell-week-at-sql-university-post-5/ ed è facile da fare. –
'SELECT *' è l'istruzione effettiva che è necessario eseguire o solo un esempio? se hai bisogno di esportare i dati, 'bcp' è una scelta migliore (e può anche essere eseguita da PowerShell, secondo il suggerimento di Ilya). –
Presumo che non venga chiamato da un ambiente di programmazione esterno come .NET perché è possibile creare facilmente ciascun comando in tale scenario. Pertanto, dobbiamo sapere: 1) stai usando una procedura memorizzata e 2) come si determinano i nomi di server e tabelle? (Esse sono passate alla procedura memorizzata? È determinato in fase di esecuzione? È possibile impostare una tabella permanente con queste informazioni?) –