我想做以下事情。 1)创建数据库。 2)创建表,存储过程等时运行脚本(此脚本由SMS'生成脚本'选项创建)
我找到了以下代码:http://www.delphipages.com/forum/showthread.php?t=181685 并将其修改为:
试
ADOQuery.ConnectionString := 'Provider=SQLOLEDB.1;Password=' +
edtPassword.Text +'; Persist Security Info = True; User ID ='+ edtUser.Text +';初始目录=主;数据源='+ edtServerName.Text;
ADOQuery.SQL.Clear; ADOQuery.SQL.Text := 'create DataBase ' + edtWebDBName.Text; ADOQuery.ExecSQL; // should check existance of database ADOWeb.Connected := false; ADOWeb.ConnectionString := 'Provider=SQLOLEDB.1;Password=' +
edtPassword.Text +'; Persist Security Info = True; User ID ='+ edtUser.Text +';初始目录='+ edtWebDBName.Text +';数据源='+ edtServerName.Text; ADOWeb.Connected:= true;
ADOQuery.Connection := ADOWeb; ADOQuery.SQL.Clear; ADOQuery.SQL.LoadFromFile(edtScriptFileName.Text); ADOQuery.ExecSQL; except
直到运行脚本文件为止。然后它会生成一个异常:“GO”附近的语法不正确。如果我在新创建的数据库上运行SMS脚本,那很好。这个问题是由于同时运行多个SQL命令(脚本本质上是一长串命令/ GO语句?如何绕过它?
哦,作为奖励,在发送脚本之前快速检查新数据库是否存在的任何想法? (或者,如果创建失败则不会产生异常?)
答案 0 :(得分:10)
Rob无法识别GO
语句,因此您必须在执行前从脚本中删除。
现在要检查数据库是否存在,您可以执行这样的查询
select COUNT(*) from sys.databases where name='yourdatabasename'
检查这个非常基本的样本
假设您有一个像这样的脚本
CREATE TABLE Dummy.[dbo].tblUsers(ID INT, UserName VARCHAR(50))
GO
INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (1, 'Jill')
GO
INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (2, 'John')
GO
INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (3, 'Jack')
GO
现在执行这句话你可以做这样的事情
const
//in this case the script is inside of a const string but can be loaded from a file as well
Script=
'CREATE TABLE Dummy.[dbo].tblUsers(ID INT, UserName VARCHAR(50)) '+#13#10+
'GO '+#13#10+
'INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (1, ''Jill'') '+#13#10+
'GO '+#13#10+
'INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (2, ''John'') '+#13#10+
'GO '+#13#10+
'INSERT INTO Dummy.[dbo].tblUsers (ID, UserName) VALUES (3, ''Jack'') '+#13#10+
'GO ';
var
DatabaseExist : Boolean;
i : Integer;
begin
try
//check the connection
if not ADOConnection1.Connected then
ADOConnection1.Connected:=True;
//make the query to check if the database called Dummy exist
ADOQuery1.SQL.Add(Format('select COUNT(*) from sys.databases where name=%s',[QuotedStr('Dummy')]));
ADOQuery1.Open;
try
//get the returned value, if is greater than 0 then exist
DatabaseExist:=ADOQuery1.Fields[0].AsInteger>0;
finally
ADOQuery1.Close;
end;
if not DatabaseExist then
begin
//create the database if not exist
ADOQuery1.SQL.Text:=Format('Create Database %s',['Dummy']);
ADOQuery1.ExecSQL;
ADOQuery1.Close;
//load the script, remember can be load from a file too
ADOQuery1.SQL.Text:=Script;
//parse the script to remove the GO statements
for i := ADOQuery1.SQL.Count-1 downto 0 do
if StartsText('GO',ADOQuery1.SQL[i]) then
ADOQuery1.SQL.Delete(i);
//execute the script
ADOQuery1.ExecSQL;
ADOQuery1.Close;
end;
except
on E:Exception do
ShowMessage(E.Message);
end;
end;
答案 1 :(得分:4)
GO表示仅针对某些Microsoft实用程序的批处理结束,它不是正确的T-SQL语句。尝试删除脚本中GO
的每个出现,然后执行它。 GO
将在您的脚本结束时为您执行ADOQuery.ExecSQL
。
关于你的第二个问题;你可以用例如SQL函数DB_ID来检查您的数据库是否存在(当然,您必须在同一台服务器上)。该函数返回数据库ID;否则为NULL,因此如果以下SQL语句返回NULL,则数据库创建失败。
ADOQuery.SQL.Text := 'SELECT DB_ID(' + edtWebDBName.Text + ')';
ADOQuery.Open;
if ADO_Query.Fields[0].IsNull then
ShowMessage('Database creation failed');
答案 2 :(得分:1)
脚本可能包含的不仅仅是SQL DDL / DML命令。它们可以包含变量,小块代码,事务管理语句。通常有多个语句,由终结符分隔(分号,Oracle斜杠,MSSQL GO等,具体取决于您使用的数据库及其脚本语法)。要正确执行脚本,您必须解析输入文件,分离每个命令,并将其正确地提供给数据库。您可以查找库(有一些,IIRC),或者您可以尝试使用MS SQL命令行工具通过它提供脚本。