2009-02-20 32 views
8

Tôi muốn lưu các thủ tục lưu trữ MS SQL Server 2005 của tôi thành tệp .sql tự động (muốn một công cụ mà tôi có thể gọi qua .bat) vì vậy tôi không phải bấm mỗi sproc đơn thủ công và lưu nó.cách lưu các thủ tục lưu sẵn SQL vào tệp .sql qua lô

Tôi đã tìm thấy SMOscript từ devio IT, nhưng nó tập hợp tất cả các bảng và sproc mất một thời gian. Có công cụ tương tự nào mà tôi có thể xác định sproc (s) nào để xuất khẩu không? Ngoài ra, tôi thiếu mệnh đề USE mà SMOScript không thêm vào tệp được xuất khẩu trái ngược với xuất manuall dưới dạng tập lệnh sproc cho CREATE.

Trân sean

Trả lời

5

Tạo tập tin thực thi với kịch bản (xin lỗi về định dạng, nhưng nó thực sự cần được inline để thực hiện hàng loạt):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt" 
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 

Tên nó là "run.bat". Bây giờ, để thực hiện params sử dụng hàng loạt:
run.bat [username] [mật khẩu] [servername] [cơ sở dữ liệu]
trên ví dụ:
run.bat sa pwd111 localhost \ SQLEXPRESS chủ
tên thủ tục đầu tiên tất cả được lưu trữ sẽ được lưu trữ trong tệp sp_list.txt, sau đó từng cái một trong các tệp tập lệnh riêng biệt. Các chỉ vấn đề - dòng cuối cùng của mỗi kịch bản với số lượng kết quả - Tôi đang workin' vào nó :)

sửa: lỗi trong truy vấn cố định

Loại bỏ 'Hàng bị ảnh hưởng' dòng
Ok, bây giờ chúng tôi cần tạo thêm một lô:

type %1 | findstr /V /i %2 > xxxtmpfile 
copy xxxtmpfile %1 /y /v 
del xxxtmpfile 

Đặt tên là "line_del.bat". Hãy xem, tham số đầu tiên là tệp để xử lý, chuỗi thứ hai để tìm kiếm các dòng để xóa.Bây giờ thay đổi hàng loạt chính (một lần nữa, xin lỗi về định dạng):

osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -n -o "sp_list.txt" 
call line_del sp_list.txt "rows affected" 
call line_del sp_list.txt "row affected" 
for /f %%a in (sp_list.txt) do osql -U %1 -P %2 -S %3 -d %4 -h-1 -Q "SELECT ROUTINE_DEFINITION FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_NAME = '%%a'" -n -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected" 

Xem bài viết liên quan:
Simple programming commands in a batch environment
osql Utility
MSSQL: How do you script Stored Procedure creation with code?
Delete certain lines in a txt file via a batch file

:) bạn có thể nhận thấy, hai cuối cùng là từ VÌ THẾ!

+0

Cảm ơn rất nhiều! Tôi đã thử một khoảng một chút, nhưng có một số vấn đề với xác thực (osql cant kết nối). Tôi sẽ cung cấp cho nó một thử những ngày tiếp theo ... tốt nhất liên quan – seansilver

+1

Nó sẽ không phá vỡ cho procs lớn? Khi tôi chạy: SELECT ROUTINE_NAME, max (len (ROUTINE_DEFINITION)) FROM INFORMATION_SCHEMA.Routines nhóm của ROUTINE_NAME đặt hàng bởi 2 desc; Tôi nhận được rất nhiều procs có 4000 ký tự. Khá chắc chắn bạn cần phải thoát khỏi sys.comments để có được dữ liệu đúng. – jcollum

+0

Rất tiếc, điều đó phải là sự syscomments trong nhận xét ở trên. – jcollum

2

Có một sự thay thế trong SQL Server Management Studio, kịch bản cơ sở dữ liệu ...

Mở rộng quan điểm Object Explorer để tìm ra cơ sở dữ liệu, nhấp chuột phải và chọn "Nhiệm vụ: Tạo Tập lệnh "

Từ đó bạn có thể viết tất cả các đối tượng, chỉ các tài liệu được lưu trữ trước, bất kỳ thứ gì ở giữa. Có một vài tùy chọn trên một trang, mặc dù chính tùy chọn tôi thay đổi là: - "Bao gồm IF NOT EXISTS"

Bằng cách chọn tùy chọn "FALSE" thì bạn chỉ nhận được toàn bộ danh sách các câu lệnh CREATE.

Sau đó, bạn có thể chọn tập lệnh đối tượng vào cửa sổ truy vấn mới hoặc tệp.

+0

Cảm ơn đã gợi ý, tiếc là tôi này có một số nhược điểm đối với tôi - Tôi phải đi qua tất cả các bước trên mỗi lần bằng tay (không tự động/mẻ) - tất cả các thủ tục lưu trữ được lựa chọn sẽ được lưu vào một sql file - không có bình luận nào được lưu – seansilver

0

Tôi muốn làm điều tương tự trong một thời gian ngắn và tôi đã kết thúc bằng cách tạo một vbscript nhỏ.

Look đây Source Control and stored procedures

0

Tôi đã sử dụng sqlcmd và -E thay vì người dùng, vượt qua. Đây hoạt động tốt cho đến nay, chỉ được lưu trữ thủ tục dài hơn 4000 ký tự sẽ có một dòng phá vỡ

sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" 
call line_del sp_list.txt "rows affected" 
call line_del sp_list.txt "row affected" 
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "rows affected" 
for /f %%a in (sp_list.txt) do call line_del %%a.sql "row affected" 

Trân sean

0

tôi thêm vào SET NOCOUNT ON để loại bỏ sự cần thiết của line_del.bat. Cũng thay thế syscomments với sys.sql_modules (SQL 2005). Tôi cũng có thể đã sử dụng hàm OBJECT_DEFINITION nhưng nó chậm hơn sys.sql_modules.

sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER -d DB -h-1 -Q "SET NOCOUNT ON SELECT definition from sys.sql_modules WHERE object_id = OBJECT_ID('%%a')" -o "%%a.sql" 
+0

Không phải là câu trả lời độc lập, phải là nhận xét về câu trả lời mà bạn đang nói đến. – jcollum

1

Thêm SET NOCOUNT ON đã thực sự loại bỏ sự cần thiết của các line_del.bat, nhưng thay thế syscomments với sys.sql_modules dẫn đến mỗi thủ tục lưu trữ được cắt ngắn để 258 ký tự. Vì vậy, để có kết quả tốt nhất, mã tôi đã sử dụng là:

sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT ROUTINE_NAME FROM INFORMATION_SCHEMA.Routines WHERE ROUTINE_TYPE = 'PROCEDURE'" -o "sp_list.txt" 
for /f %%a in (sp_list.txt) do sqlcmd -E -S SERVER-d DB -h-1 -Q "SET NOCOUNT ON SELECT text from dbo.syscomments WHERE id = OBJECT_ID('%%a')" -o "%%a.sql" 

Làm việc và không cần sử dụng line_del.bat. Những gì tôi didnt nhận được khi tôi đã làm việc xuất khẩu thủ công bằng cách sử dụng thuật sĩ SSMS (Nhiệm vụ/Tạo Script/Stored Procedure/Chọn tất cả) là:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

vào đầu mỗi sql, và lệnh trailing GO cũng . Không vô cùng quan trọng nhưng cần lưu ý điều gì đó. Cảm ơn Max Gontar, Seansilver và Lee vì những đóng góp của bạn! Bây giờ tôi có thể tự động sao lưu các thủ tục được lưu trữ trong cơ sở dữ liệu và áp dụng điều khiển phiên bản.

0

Nhờ tất cả những điều trên để được trợ giúp và để nguyên điều này ở đây cho các noobs sqlcmd khác như tôi tìm thấy. Hoạt động trên máy chủ sql 2005. objectName là một thủ tục, xem vv tên.

:reset 

-- :setvar ObjectName "objectName" -- works 
:setvar ObjectName objectName -- works too 
declare @sql varchar(max); 
set @sql = 'select text from dbo.syscomments where id = object_id(upper("' + '$(ObjectName)' + '"))'; 
-- exec sp_helptext $(ObjectName) -- quick n easy but gets chopped to 256 width 
/* 4000 byte limit 
set @sql = 
    'select view_definition 
    from information_schema.views 
    where upper(table_name) = upper("' + '$(ObjectName)' + '")'; 
*/ 
:out $(ObjectName).sql 

exec(@sql) 
go 

:out stdout 
Các vấn đề liên quan