我对SQL很陌生,我想出了一个我无法解决的问题,尽管我已经考虑了几个小时了。我即将提出的问题表明我在SQL服务器上的随机数据库中有一些表和一些存储过程。这些表和SP使用以下格式命名:
[schema name].[table name]
和
[schema name].[sp name]
我的任务是捕获这两个值,无论是表名还是SP。
我在C#上执行了下面的语句(包含4个SQL查询),然后通过SqlDataReader读取输出值,我认为我已经将模式名称与它们旁边的表/ SP名称相匹配。他们中的大多数都做了,但我需要让所有这些都正确匹配。
if (requestCode == 1)
{
SetSpecificList("USE " + db_name + "; SELECT * FROM sys.tables", "USE " + db_name + "; SELECT * FROM INFORMATION_SCHEMA.TABLES", tablesList, requestCode);
}
else if (requestCode == 2)
{
SetSpecificList("USE " + db_name + "; SELECT * FROM sys.procedures", "USE " + db_name + "; SELECT * FROM INFORMATION_SCHEMA.ROUTINES", SPList, requestCode);
}
我很欣赏在两个查询中组合两个SQL语句(只是一个语句)以获取表/ SP的全名而不是将其分为[schema name][table name]
的建议。
答案 0 :(得分:0)
由于in this article概述的原因,我总是倾向于使用update()
上的系统目录视图,而且我不能100%确定为什么你在这种情况下使用两者......
无论如何,您可以使用INFORMATION_SCHEMA
功能,例如
OBJECT_SCHEMA_NAME()
或者您可以加入SELECT TableName = QUOTENAME(OBJECT_SCHEMA_NAME(t.object_id)) + '.' + QUOTENAME(t.name)
FROM sys.tables AS t;
:
sys.schemas
但是,对于它的价值,您可以从同一个表中获取过程和表(以及所有其他对象):
SELECT TableName = QUOTENAME(s.name) + '.' + QUOTENAME(t.name)
FROM sys.tables AS t
INNER JOIN sys.schemas AS s
ON s.schema_id = t.schema_id;