2008-10-10 19 views
6

Tôi đang sử dụng SQLServer cho lần đầu tiên, và trong mỗi một đơn của tạo kịch bản thủ tục của chúng tôi có một khối mã như dưới đây để loại bỏ các thủ tục nếu nó đã tồn tại:Hãy cho thả THỦ TỤC một tham số

IF EXISTS (SELECT * 
      FROM information_schema.routines 
      WHERE routine_name = 'SomeProcedureName' 
      AND routine_type = 'PROCEDURE' 

BEGIN 
    DROP PROCEDURE SomeProcedureName 
END 
//then the procedure definition 

để ngăn chặn cắt và dán mã boilerplate này trong mỗi tập tin tôi muốn đặt mã này trong thủ tục lưu trữ riêng của mình để thay vào đó là kịch bản sẽ trông như thế này:

DropIfRequired('SomeProcedureName') 
//then the procedure definition 

nỗ lực của tôi tại một giải pháp là:

CREATE PROCEDURE DropIfRequired 
(
    @procedureName varchar 
) 
AS 
IF EXISTS (SELECT * FROM information_schema.routines 
      WHERE routine_name = @procedureName 
      AND routine_type = 'PROCEDURE') 
BEGIN 
    DROP PROCEDURE @procedureName 
END 

Nhưng sau đó tôi nhận được lỗi sau:

Msg 102, Level 15, State 1, Thủ tục DeleteProcedure, Dòng 10 cú pháp sai gần '@procedureName'.

Bất kỳ ý tưởng nào về cách thực hiện những gì tôi muốn?

+0

Giải pháp này (http://dba.stackexchange.com/q/47186/16776) để biết thêm giải pháp này. – Sam

Trả lời

7

Câu trả lời đầy đủ là:

 
DECLARE @SQL VARCHAR(8000) 
SELECT @SQL = 'USE ' + DB_NAME() + CHAR(10) 
SET @SQL = @SQL + 'DROP PROCEDURE ' + @procName 
--PRINT @SQL 
EXEC(@SQL) 

Một do Andrew sẽ chỉ làm việc nếu cơ sở dữ liệu mặc định cho đăng nhập của bạn được thiết lập để các cơ sở dữ liệu mà bạn muốn. Khi sử dụng sql động bạn sẽ có được một bối cảnh cơ sở dữ liệu mới. Vì vậy, nếu bạn không có một bộ cơ sở dữ liệu mặc định, bạn sẽ thực thi lệnh từ master.

+0

Vâng, đúng vậy. Tôi đã bị đốt cháy bởi sự giám sát đó trước đây. – StingyJack

3

dấu ngoặc kép bị thiếu của nó, hãy thử thêm chúng bằng câu lệnh exec.

EXEC('DROP PROCEDURE ''' + @procName + '''') (all single quotes) 
+0

Có lẽ tốt hơn 'exec ('DROP PROCEDURE [' + @procName + ']')' – abatishchev

4

Một điều cần lưu ý là trong thủ tục DropIfRequired, bạn đã xác định tên thủ tục như sau:

CREATE PROCEDURE DropIfRequired 
( 
    @procedureName varchar 
) 

Bạn cần phải xác định chiều dài của tham số varchar, nếu không SQL sẽ đảm nhận một chiều dài của một tính cách. Thay vào đó, hãy làm điều gì đó như sau (1000 phải quá đủ cho hầu hết các tên thủ tục)

CREATE PROCEDURE DropIfRequired 
( 
    @procedureName varchar(1000) 
) 
+0

Bạn cũng có thể sử dụng datatype sysname (tương đương với nvarchar (128)), sẽ chứa bất kỳ tên đối tượng hợp lệ nào. – GilM

+0

"1000 nên quá đủ cho * hầu hết * tên thủ tục" ... Tôi rùng mình nghĩ về các ngoại lệ. –

Các vấn đề liên quan