Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在查询中动态更改我的DB名称,但不使用exec字符串?_Sql Server_Sql Server 2008_Tsql_Dynamic - Fatal编程技术网

Sql server 如何在查询中动态更改我的DB名称,但不使用exec字符串?

Sql server 如何在查询中动态更改我的DB名称,但不使用exec字符串?,sql-server,sql-server-2008,tsql,dynamic,Sql Server,Sql Server 2008,Tsql,Dynamic,我的SQL server中有很多DB,有时为了测试的目的,我们会放一个QA DB server的副本,然后我希望有一个变量,从一个表中选择一个值,该值指示DB的名称和我函数中的更改,而无需重写函数来更改DB的名称,或者执行一个字符串来执行此操作。我该怎么做 CREATE SYNONYM Cust FOR DB1.dbo.Customer GO SELECT * FROM Cust GO DROP SYNONYM Cust CREATE SYNONYM Cust FOR DB2.dbo.Cus

我的SQL server中有很多DB,有时为了测试的目的,我们会放一个QA DB server的副本,然后我希望有一个变量,从一个表中选择一个值,该值指示DB的名称和我函数中的更改,而无需重写函数来更改DB的名称,或者执行一个字符串来执行此操作。我该怎么做

CREATE SYNONYM Cust FOR DB1.dbo.Customer
GO

SELECT * FROM Cust
GO

DROP SYNONYM Cust
CREATE SYNONYM Cust FOR DB2.dbo.Customer
GO

SELECT * FROM Cust
这种技术有局限性,但在某些情况下非常有用:

这种技术有局限性,但在某些情况下非常有用:

这种技术有局限性,但在某些情况下非常有用:




这种技术有局限性,但在某些情况下非常有用:

如果没有动态SQL,您无法做到这一点,而且您肯定无法在函数中做到这一点。如果我正确理解了这个问题,您可能可以使用动态SQL来做到这一点。如果您的QA服务器是另一个DB服务器上的链接服务器,则可以使用[ServerName].[DbName].[Schema].[Table]查询它。例如:
SELECT*FROM[QAServer].[qadabase].[dbo].[MyTable]
。但是,如果您不小心,这可能会导致性能差(或在某些情况下存在安全漏洞),我不明白您希望如何更改函数中db的名称,但不需要重写函数。我的意思是,要做一些非常通用的事情,请重写所有函数,但当我需要切换db名称时,不需要更改DB的所有函数名。如果没有动态SQL,您无法做到这一点,并且您肯定无法在函数中做到这一点。如果我正确理解了这个问题,您可能可以使用动态SQL来做到这一点。如果您的QA服务器是另一个DB服务器上的链接服务器,则可以使用[ServerName].[DbName].[Schema].[Table]查询它。例如:
SELECT*FROM[QAServer].[qadabase].[dbo].[MyTable]
。但是,如果您不小心,这可能会导致性能差(或在某些情况下存在安全漏洞),我不明白您希望如何更改函数中db的名称,但不需要重写函数。我的意思是,要做一些非常通用的事情,请重写所有函数,但当我需要切换db名称时,不需要更改DB的所有函数名。如果没有动态SQL,您无法做到这一点,并且您肯定无法在函数中做到这一点。如果我正确理解了这个问题,您可能可以使用动态SQL来做到这一点。如果您的QA服务器是另一个DB服务器上的链接服务器,则可以使用[ServerName].[DbName].[Schema].[Table]查询它。例如:
SELECT*FROM[QAServer].[qadabase].[dbo].[MyTable]
。但是,如果您不小心,这可能会导致性能差(或在某些情况下存在安全漏洞),我不明白您希望如何更改函数中db的名称,但不需要重写函数。我的意思是,要做一些非常通用的事情,请重写所有函数,但当我需要切换db名称时,不需要更改DB的所有函数名。如果没有动态SQL,您无法做到这一点,并且您肯定无法在函数中做到这一点。如果我正确理解了这个问题,您可能可以使用动态SQL来做到这一点。如果您的QA服务器是另一个DB服务器上的链接服务器,则可以使用[ServerName].[DbName].[Schema].[Table]查询它。例如:
SELECT*FROM[QAServer].[qadabase].[dbo].[MyTable]
。但是,如果您不小心,这可能会导致性能差(或在某些情况下存在安全漏洞),我不明白您希望如何更改函数中db的名称,但不需要重写函数。我的意思是,要做一些非常通用的事情,请重写所有函数,但当我需要切换db名称时,没有必要更改DB的所有函数名。这很好,我不知道你可以这么做。但是,这不是只有在两个数据库位于同一服务器上时才起作用吗?或者它也适用于链接服务器?这是一个好主意,但我的数据库有很多表,它可以适用于某些情况,但我正在尝试找到一个通用的解决方案。(让我读你的链接)你读了我的链接吗?远程或区域设置对象:`EXEC sp_addlinkedserver Server_Remote;使用tempdb;转到为服务器创建同义词MyEmployee_Remote.AdventureWorks2012.HumanResources.Employee;GO`这可能行得通,我只需要部门里有一个策略来切换beetween DB,最好的是它对程序员来说是隐形的,对程序员来说不是隐形的。如果您希望一个程序员将Cust视为DB1.dbo.Customer,另一个程序员将Cust视为DB2.dbo.Customer,那么您建议如何同时这样做?同义词一次只能指向一个对象,因此当您是唯一的开发人员时,它可能会起作用,但除此之外,您运气不佳……这很好,我不知道您能做到这一点。但是,这不是只有在两个数据库位于同一服务器上时才起作用吗?或者它也适用于链接服务器?这是一个好主意,但我的数据库有很多表,它可以适用于某些情况,但我正在尝试找到一个通用的解决方案。(让我读你的链接)你读了我的链接吗?远程或区域设置对象:`EXEC sp_addlinkedserver Server_Remote;使用tempdb;转到为服务器创建同义词MyEmployee_Remote.AdventureWorks2012.HumanResources.Employee;GO`这可能行得通,我只需要部门里有一个策略来切换beetween DB,最好的是它对程序员来说是隐形的,对程序员来说不是隐形的。如果您希望一个程序员将Cust视为DB1.dbo.Customer,另一个程序员将Cust视为DB2.dbo.Customer,那么您建议如何同时这样做?同义词一次只能指向一个对象,因此当您是唯一的开发人员时,它可能会起作用,但除此之外,您运气不佳……这很好,我不知道您能做到这一点。但是,这不是只有在两个数据库位于同一服务器上时才起作用吗?或者它也适用于链接服务器?这是一个好主意,但我的数据库有很多表,它可以适用于某些情况,但我正在尝试找到一个通用的解决方案。(让我再说一遍