使用information_schema_tables并连接

时间:2015-12-24 12:12:45

标签: sql sql-server

我想知道如何使用information_schema_tables选择查询来查找@tablename,以便显示table's catalog和架构,然后将它连接在一起以便{ {1}}显示为@tablename

目前我只是使用select table_catalog.table_schema.table name'

来调用表名
@tablename = Value

3 个答案:

答案 0 :(得分:0)

在SQL Server中,您可以使用“+”来连接字符串。

declare @tablename varchar(MAX)
select @tablename = TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME
from INFORMATION_SCHEMA.TABLES 
where TABLE_NAME = 'TableName'

请记住,如果您的查询返回多行,@ tablename变量将包含返回的最后一个值。

答案 1 :(得分:0)

select quotename(db_name()) + '.' + quotename( schemas.name ) + '.' + quotename( tables.name ) 
from sys.tables
join sys.schemas on tables.schema_id = schemas.schema_id

一些注意事项:"目录"在ANSI中讲的是SQL Server中的数据库,因此在数据库中它几乎是一个常量值 - 当前数据库的名称。

在SQL Server中,我发现系统视图比INFORMATION_SCHEMA更加一致和可靠,后者主要起作用但有一些奇怪的问题。

答案 2 :(得分:0)

根据您的last question我想建议以下UDF:

您传入XML和目录的名称(或NULLDEFAULT),并使用架构的名称。该函数将使用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):

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));