2015-06-30 3 views
0

Я новичок в SQL Server и нуждаюсь в помощи в завершении хранимой процедуры. Вот код:Попытка обернуть хранимую процедуру

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

IF OBJECT_ID('spCopyPurchaseOrders') IS NOT NULL 
    DROP PROC spCopyPurchaseOrders; 

GO 

CREATE PROC spCopyPurchaseOrders 
AS 

    IF OBJECT_ID('PurchaseOrders') IS NOT NULL 
     DROP TABLE PurchaseOrders; 
    SELECT * 
    INTO PurchaseOrdersCopy 
    FROM PurchaseOrders; 

Я не могу получить зр признать базу данных, даже если у меня есть действующий USE заявление в верхней части сценария. Есть идеи?

+0

Код не работает на 'FROM PurchaseOrders;' – oakrun

+2

Это должно потерпеть неудачу, так как вы отбросили таблицу 'PurchaseOrders'. –

+2

Было бы разумнее, если бы вы уронили 'PurchaseOrdersCopy' вместо' PurchaseOrders' –

ответ

0

Как закодирован, то PurchaseOrders таблица удаляется до SELECT

IF OBJECT_ID('PurchaseOrders') IS NOT NULL 
    DROP TABLE PurchaseOrders; -- <<< this breaks the SELECT FROM 
SELECT * 
INTO PurchaseOrdersCopy 
FROM PurchaseOrders; -- <<< can't possible exist, the IF...DROP saw to it 

И так как вы используете SELECT...INTO, вы, вероятно, означает PurchaseOrdersCopy

Но, это было бы намного лучше

-- create an empty table, but just once, otherwise empty the existing table 
IF OBJECT_ID('dbo.PurchaseOrdersCopy') IS NULL 
    SELECT * 
    INTO dbo.PurchaseOrdersCopy 
    FROM dbo.PurchaseOrders 
    WHERE 1=0 
ELSE IF EXISTS (SELECT * FROM dbo.PurchaseOrdersCopy ) 
    DELETE FROM dbo.PurchaseOrdersCopy; -- HINT: see if TRUNCATE TABLE dbo.PurchaseOrdersCopy is an option for you 

-- this will be longer if you have an IDENTITY column 
-- SET IDENTITY_INSERT ON (for example) 
INSERT INTO dbo.PurchaseOrdersCopy 
SELECT * 
FROM dbo.PurchaseOrders;  

В частности:

а) попытаться избежать DROP и CREATE, когда вы можете

б) префикс для ваших имен объектов с именем схемы (dbo. по умолчанию)

проблемы: как это будет работать, если процедура может выполняться более одного раза или более чем одним человеком (dbo.PurchaseOrdersCopy является общим)

Смежные вопросы