Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 使用变量调用[database].[schema]_Sql_Sql Server - Fatal编程技术网

Sql 使用变量调用[database].[schema]

Sql 使用变量调用[database].[schema],sql,sql-server,Sql,Sql Server,我试图操作现有的代码,因为在测试时,它没有引用表的确切位置。我的意思是,它不引用表的数据库名和模式以及表名。示例:如果该表被称为'package',那么此时它只在update语句“package”中输出,而不是'Holidays.dbo.package'假日显然是数据库名称 但问题是,我所指的表可能不在Holidays数据库中,它可能来自其他数据库或模式。所以我不能简单地添加update'Holidays.dbo.+@tablename,我需要它更具动态性 我的问题是,如果我设置了两个变量来调用

我试图操作现有的代码,因为在测试时,它没有引用表的确切位置。我的意思是,它不引用表的数据库名和模式以及表名。示例:如果该表被称为
'package'
,那么此时它只在update语句“package”中输出,而不是
'Holidays.dbo.package'
<代码>假日显然是数据库名称

但问题是,我所指的表可能不在
Holidays
数据库中,它可能来自其他数据库或模式。所以我不能简单地添加
update'Holidays.dbo.+@tablename
,我需要它更具动态性

我的问题是,如果我设置了两个变量来调用数据库和模式,如何设置变量来引用它们

以下是我提取的代码中我认为与此问题相关的部分:

declare @tablename varchar(MAX)
declare @loop int = 1           

select  a.* into #tmp
from 
(
select  RID,
v.value('local-name(.)', 'VARCHAR(MAX)')  'Field', 
v.value('./text()[1]', 'VARCHAR(MAX)')   'Value'        
from  #XMLTemp
cross apply Field.nodes ('/Record/*') x(v)
where v.value('local-name(.)', 'VARCHAR(MAX)')  not in ('Update', 'Filter', 'Insert', 'Delete')
) as a
where RID = @loop

...

select @tablename = ''
select @tablename = Value
from #tmp
where Field='tableName'
and RID = @loop

...

print 'update ' + @tablename + '

...

select @tablename = Value from #tmp where Field = 'TableName'

...

set @loop = @loop+1
更新:

下面是“ProductPerson”表的xml,其中输入了新值及其以前的值

<Task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Record>
    <order>1</order>
    <TableName>ProductPerson</TableName>
    <KeyField>ProductPersonID</KeyField>
    <TableRef>32420</TableRef>
    <Update>
      <FieldName>StatusID</FieldName>
      <OldValue>3</OldValue>
      <NewValue>8</NewValue>
    </Update>
  </Record>
</Task>

据我所知,sql语句在特定数据库中运行,不能从一个数据库跳到另一个数据库

健康的程序通常只使用一个数据库将其数据存储在所需的表中

但是,如果您仍然希望使用多个数据库和模式,则可以动态更改与数据库的连接,因为此时选择了与您交谈的数据库。

类似的内容

declare @x  xml=
'<Task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Record>
    <order>1</order>
    <TableName>ProductPerson</TableName>
    <KeyField>ProductPersonID</KeyField>
    <TableRef>32420</TableRef>
    <Update>
      <FieldName>StatusID</FieldName>
      <OldValue>3</OldValue>
      <NewValue>8</NewValue>
    </Update>
  </Record>
</Task>';


DECLARE @DataBaseName VARCHAR(100)='MyDataBase';
DECLARE @DataBaseSchema VARCHAR(100)='MySchema';

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT One.Record.value('order[1]','int')
      ,'UPDATE ' + @DataBaseName + '.' + @DataBaseSchema + '.' + One.Record.value('TableName[1]','varchar(max)') 
        + ' SET ' + One.Record.value('(Update/FieldName)[1]','varchar(max)') + '=''' + One.Record.value('(Update/NewValue)[1]','varchar(max)') + ''' '
        + ' WHERE ' + One.Record.value('KeyField[1]','varchar(max)') + '=''' +  One.Record.value('TableRef[1]','varchar(max)') + ''';'
FROM @x.nodes('/Task/Record') AS One(Record) 

您能粘贴XML(或其相关部分)吗?我觉得可能有更好的方法…@Shnugo,抱歉迟到,我在开会,我已经在更新中包含了上面的代码,没问题,XML的thx。这将始终是“一个可靠的声明”还是一个TAK(或记录)中包含多个声明?我是否正确理解您希望对数据库执行任务的操作?在其他CRUD操作中,XMLs是什么样子的?它将始终是一条可靠的语句。实际上,当我们将打印的update语句复制并通过一个新查询时,我们必须始终在表名之前分别键入db和schema,但是如果我们可以自动打印它,然后进行排序。通常这种事情在应用程序框架级别解决,因为你真的不想自己管理连接。您可以获得到数据库的缓存连接(通常具有预设的模式查找路径),因此您不必自己指定数据库/模式。你可以,有时你不得不这样做,但这通常是不必要的。通常应该避免使用动态SQL,因为这是SQL注入的一个好方法。如果您确实需要使用动态表名,请在运行该语句之前验证它们是否存在(这将限制许多恶作剧)。几乎可以做到这一点,但我们必须想象我们不知道表的确切数据库和模式位置,因此我们希望代码能够为我们找到它并在xml中实现它。在您的示例中,您声明我们知道它在“MyDataBase”和“MySchema”中,但是想象一下,如果我们不知道,我们如何检索它。这有意义吗?@BruceyBandit该从何处获得这些信息?你在哪个州知道这个?这叫什么/从哪里来的?我必须退出,圣诞节,家庭…:-)祝你好运和快乐。如果有帮助,请投赞成票,谢谢。很酷,我只是想把它贴在一个单独的链接上,但不用担心。谢谢你的帮助,我将投票表决,并努力找出答案
declare @x  xml=
'<Task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Record>
    <order>1</order>
    <TableName>ProductPerson</TableName>
    <KeyField>ProductPersonID</KeyField>
    <TableRef>32420</TableRef>
    <Update>
      <FieldName>StatusID</FieldName>
      <OldValue>3</OldValue>
      <NewValue>8</NewValue>
    </Update>
  </Record>
</Task>';


DECLARE @DataBaseName VARCHAR(100)='MyDataBase';
DECLARE @DataBaseSchema VARCHAR(100)='MySchema';

WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi)
SELECT One.Record.value('order[1]','int')
      ,'UPDATE ' + @DataBaseName + '.' + @DataBaseSchema + '.' + One.Record.value('TableName[1]','varchar(max)') 
        + ' SET ' + One.Record.value('(Update/FieldName)[1]','varchar(max)') + '=''' + One.Record.value('(Update/NewValue)[1]','varchar(max)') + ''' '
        + ' WHERE ' + One.Record.value('KeyField[1]','varchar(max)') + '=''' +  One.Record.value('TableRef[1]','varchar(max)') + ''';'
FROM @x.nodes('/Task/Record') AS One(Record) 
1   UPDATE MyDataBase.MySchema.ProductPerson SET StatusID='8'  WHERE ProductPersonID='32420';