我想知道如何使用information_schema_tables
选择查询来查找@tablename
,以便显示table's catalog
和架构,然后将它连接在一起以便{ {1}}显示为@tablename
?
目前我只是使用select table_catalog.table_schema.table name'
@tablename = Value
答案 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和目录的名称(或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
):
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));