如何在Java(和SQL Server)中使用Statement.execute()更改数据库架构?

如何在Java(和SQL Server)中使用Statement.execute()更改数据库架构?,java,sql-server,Java,Sql Server,我需要以编程方式执行SQL Server系统存储过程,因为它在当前模式中执行,所以我需要动态更改它 像这样 语句st=connection.createStatement(); st.execute(“EXEC SP_ADDUSER”“,”) 但是SP_ADDUSER只在连接的当前模式集上执行,所以如果我想在各种模式中创建用户,我需要更改它,这就是我要找的。我认为不可能更改连接指向的数据库 您可能需要为每个数据库(模式)创建一个单独的数据源/连接。我认为不可能更改连接指向哪个数据库 您可能需要为

我需要以编程方式执行SQL Server系统存储过程,因为它在当前模式中执行,所以我需要动态更改它

像这样

语句st=connection.createStatement(); st.execute(“EXEC SP_ADDUSER”“,”)


但是SP_ADDUSER只在连接的当前模式集上执行,所以如果我想在各种模式中创建用户,我需要更改它,这就是我要找的。

我认为不可能更改连接指向的数据库


您可能需要为每个数据库(模式)创建一个单独的数据源/连接。

我认为不可能更改连接指向哪个数据库

您可能需要为每个数据库(架构)创建一个单独的数据源/连接。

EXEC..sp\u adduser
可以从到任何数据库的连接运行(比如说,
master
)。连接不会受到影响

例如,在我的系统上,以下各项似乎可以正常工作:

USE master
EXEC sp_addlogin 'test1'
EXEC SandBox..sp_adduser 'test1'
同样的事情也可以通过客户端正常工作。客户端连接是否正在改变SQL

using System;
using System.Data.SqlClient;

namespace TestUse
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection cn = new SqlConnection("Server=(local);Database=master;Trusted_Connection=True;");
            cn.Open();
            SqlCommand cmd = new SqlCommand("USE master; EXEC sp_addlogin 'test1'; EXEC SandBox..sp_adduser 'test1'", cn);
            cmd.ExecuteNonQuery();
            cn.Close();
        }
    }
}
EXEC..sp_adduser
可以从连接到任何数据库的连接运行(比如说,
master
)。连接不会受到影响

例如,在我的系统上,以下各项似乎可以正常工作:

USE master
EXEC sp_addlogin 'test1'
EXEC SandBox..sp_adduser 'test1'
同样的事情也可以通过客户端正常工作。客户端连接是否正在改变SQL

using System;
using System.Data.SqlClient;

namespace TestUse
{
    class Program
    {
        static void Main(string[] args)
        {
            SqlConnection cn = new SqlConnection("Server=(local);Database=master;Trusted_Connection=True;");
            cn.Open();
            SqlCommand cmd = new SqlCommand("USE master; EXEC sp_addlogin 'test1'; EXEC SandBox..sp_adduser 'test1'", cn);
            cmd.ExecuteNonQuery();
            cn.Close();
        }
    }
}

可以在批处理中使用USE语句,也可以只使用完全限定的对象名(尽管数据库中不存在sp_adduser,但它将在master中搜索并“虚拟地”使用)。可以在批处理中使用USE语句,也可以简单地使用完全限定的对象名(虽然sp_adduser在数据库中不存在,但它将在master中搜索并“虚拟地”使用)。它可以工作……但似乎无法在正确的数据库中创建用户,因为SP在当前数据库中创建用户。由于我需要能够在除master之外的数据库中执行此操作,因此它无法工作……“USE master”会为错误的语法抛出SQLException我提供的批处理在SQL Server 2005中工作,在沙盒数据库中创建登录名和用户。如果只发送一行,则只需要最后一行。即使在我的批处理中,当前数据库是master。我用它明确地表明,如果使用完全限定的对象名,当前数据库并不重要。。。USE工作正常…EXEC..sp\U adduser也正常。感谢您的帮助说明,在JDBC中调用存储过程的标准方法是使用类似“{call sp_name('panner')}”的命令。它可以工作……但似乎无法在正确的数据库中创建用户,因为sp在当前数据库中创建用户。由于我需要能够在除master之外的数据库中执行此操作,因此它无法工作……“USE master”会为错误的语法抛出SQLException我提供的批处理在SQL Server 2005中工作,在沙盒数据库中创建登录名和用户。如果只发送一行,则只需要最后一行。即使在我的批处理中,当前数据库是master。我用它明确地表明,如果使用完全限定的对象名,当前数据库并不重要。。。USE工作正常…EXEC..sp\U adduser也正常。感谢您的帮助说明,在JDBC中调用存储过程的标准方法是使用类似“{call sp_name('span')}”的命令。