En utilisant l'exemple de base de données AdventureWorks avant même de travailler dessus sur mon serveur de dev, j'ai créé une vue (Vx_CustomerAddressUpdate
) et une tableau (Cx_CustomerAddressUpdate
).SQL Server: procédure stockée qui insère quotidiennement les résultats d'une vue dans une table personnalisée avec un datastamp
CREATE VIEW Vx_CustomerAddressUpdate AS
SELECT Sales.customer.AccountNumber,
Sales.Customer.CustomerType,
Sales.Customer.ModifiedDate,
Sales.CustomerAddress.ModifiedDate,
person.Address.AddressLine1,
person.Address.AddressLine2,
person.Address.City,
Person.Address.PostalCode,
Person.StateProvince.Name,
Person.CountryRegion.Name
FROM Sales.Customer INNER JOIN Sales.CustomerAddress
ON Sales.Customer.CustomerID=Sales.CustomerAddress.CustomerID
INNER JOIN Person.Address
ON Sales.CustomerAddress.AddressID=Person.Address.AddressID
INNER JOIN Person.StateProvince
ON person.Address.StateProvinceID=Person.StateProvince.StateProvinceID
INNER JOIN Person.CountryRegion ON
Person.StateProvince.CountryRegionCode=Person.CountryRegion.CountryRegionCode
WHERE Person.CountryRegion.CountryRegionCode = 'US'
La procédure stockée insère quotidiennement les lignes de vue dans la table personnalisée. La table personnalisée a un champ supplémentaire pour suivre la date à laquelle chaque ligne a été ajoutée à la table personnalisée, qui doit être mise à jour pendant l'insertion.
IF EXISTS (
SELECT *
FROM sys.procedures
WHERE schema_id=schema_id('dbo')
AND name = N'usp_CustomerAddressUpdate')
DROP PROCEDURE dbo.usp_CustomerAddressUpdate
GO
CREATE PROCEDURE usp_CustomerAddressUpdate
AS
BEGIN
SET NOCOUNT ON;
SELECT * INTO Cx_CustomerAddressUpdate
FROM dbo.Vx_CustomerAddressUpdate
END
GO
Les défis actuels auxquels sont confrontés sont je:
SELECT INTO
crée une nouvelle table. Je dois insérer dans une table existante. Toutes les solutions que j'ai trouvées pour cela sont conçues pour des valeurs explicites.J'ai également essayé
SELECT INTO #temptable
, mais je fais face aux mêmes problèmes que ci-dessus quand il s'agit de pousser ces résultats dans la table personnalisée.OPENROWSET
semble être surpuissant pour un fonctionnement SP sur un serveur local
Pour # 1: Je recommande toujours spécifier explicitement votre colonne listes - à la fois pour le 'INSERT INTO dbo.YourTable (liste de colonnes)' ainsi que le 'SELECT (liste de colonnes) FROM dbo.YourOtherTable ....'. Utiliser un 'SELECT *' comme source pour une instruction INSERT est dangereux et une mauvaise pratique - et si les tables source et/ou cible changeaient soudainement de structure? –