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