Sql 使用信息\u模式\u表并连接

Sql 使用信息\u模式\u表并连接,sql,sql-server,Sql,Sql Server,我想知道如何使用information\u schema\u tablesselect查询来查找@tablename,以便显示表的目录和架构,然后将其连接在一起,从而将@tablename显示为table\u catalog.table\u schema.table name' 目前,我只是使用select@tablename=Value调用表名 declare @tablename varchar(MAX) declare @tableschema varchar(MAX) decla

我想知道如何使用
information\u schema\u tables
select查询来查找
@tablename
,以便显示
表的目录
和架构,然后将其连接在一起,从而将
@tablename
显示为
table\u catalog.table\u schema.table name'

目前,我只是使用select
@tablename=Value调用表名

declare @tablename varchar(MAX)
  declare @tableschema 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 Table_Catalog, Table_Schema
from Information_Schema.Tables 

...

    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
在SQL Server中,可以使用“+”连接字符串

declare @tablename varchar(MAX)
select @tablename = TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME
from INFORMATION_SCHEMA.TABLES 
where TABLE_NAME = 'TableName'
请记住,如果查询返回多行@tablename变量将包含最后返回的值

select quotename(db_name()) + '.' + quotename( schemas.name ) + '.' + quotename( tables.name ) 
from sys.tables
join sys.schemas on tables.schema_id = schemas.schema_id
注意:ANSI speak中的“Catalog”是SQL Server中的数据库,因此在数据库中它几乎是一个常量值—当前数据库的名称

在SQL Server中,我发现系统视图比信息模式更一致、更可靠,信息模式大多有效,但存在一些奇怪的问题。

根据您的建议,我建议使用以下UDF:

传入XML和目录的名称(或
NULL
DEFAULT
)以及模式的名称。该函数将使用
COALESCE
来使用右侧部分:

CREATE FUNCTION dbo.CreateUpdateStatement
(
     @XmlData XML
    ,@CatalogName VARCHAR(100) = NULL
    ,@SchemaName VARCHAR(100) = NULL
)
RETURNS VARCHAR(MAX)
BEGIN
    DECLARE @RetVal VARCHAR(MAX);

    WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' AS xsi)
    SELECT @RetVal=
              'UPDATE ' 
                     + COALESCE(@CatalogName + '.',TheTable.TABLE_CATALOG + '.', '') 
                     + COALESCE(@SchemaName + '.',TheTable.TABLE_SCHEMA + '.', 'dbo.') 
                     + 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 @XmlData.nodes('/Task/Record') AS One(Record) 
    OUTER APPLY
    (
        SELECT TOP 1 TABLE_CATALOG,TABLE_SCHEMA,TABLE_NAME 
        FROM INFORMATION_SCHEMA.TABLES 
        WHERE TABLE_NAME=One.Record.value('TableName[1]','varchar(max)')
    ) AS TheTable;

    RETURN @RetVal;
END
GO
这就是它的名称(我在我的一个目录中使用了一个现有表的名称
spz.dbo.AuditRow
):


我很困惑。。。
从信息\u架构中选择表目录、表架构、表名称有什么问题。表
?这不是给了您目录、模式和表名吗?请注意,所有回答SO的专业人士都渴望获得声誉积分。请投票选出所有有帮助的答案,并将最佳答案标记为已接受。谢谢!
DECLARE @x  xml=
'<Task xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <Record>
    <order>1</order>
    <TableName>AuditRow</TableName>
    <KeyField>ProductPersonID</KeyField>
    <TableRef>32420</TableRef>
    <Update>
      <FieldName>StatusID</FieldName>
      <OldValue>3</OldValue>
      <NewValue>8</NewValue>
    </Update>
  </Record>
</Task>';

SELECT dbo.CreateUpdateStatement(@x,DEFAULT,DEFAULT);       
--UPDATE spz.dbo.AuditRow SET StatusID='8'  WHERE ProductPersonID='32420';

SELECT dbo.CreateUpdateStatement(@x,'MyCatalog',DEFAULT);   
--UPDATE MyCatalog.dbo.AuditRow SET StatusID='8'  WHERE ProductPersonID='32420';

SELECT dbo.CreateUpdateStatement(@x,DEFAULT,'MySchema');    
--UPDATE spz.MySchema.AuditRow SET StatusID='8'  WHERE ProductPersonID='32420';


SELECT dbo.CreateUpdateStatement(@x,'MyCatalog','MySchema');
--UPDATE MyCatalog.MySchema.AuditRow SET StatusID='8'  WHERE ProductPersonID='32420';
EXEC (SELECT dbo.CreateUpdateStatement(@x,NULL,NULL));