2011-07-27 2 views
0

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:

  1. 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.

  2. 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.

  3. OPENROWSET semble être surpuissant pour un fonctionnement SP sur un serveur local

+0

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? –

Répondre

1

Qu'en est la syntaxe Insert into typique:

Insert Into Cx_CustomerAddressUpdate (<column list>,dateAdded) 
Select <columns>,getdate() as dateAdded 
From dbo.Vx_CustomerAddressUpdate 
+0

+1, Cela semble être la réponse évidente – Lamak

+0

C'est toujours quelque chose de stupide n'est-ce pas? J'avais() autour du jeu de colonnes Select. – Cassandra

+0

@ Cassandra heureux d'entendre que c'était quelque chose de simple :). Assurez-vous de marquer les réponses aux questions. –

Questions connexes