我试图使用存在于一个数据库但不存在于另一个数据库中的information_schema.routines来查询存储过程定义的列表.
SELECT
t1.Routine_Definition
FROM
[server1].MyDatabase.INFORMATION_SCHEMA.Routines t1
LEFT JOIN
[server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name
WHERE
t2.Routine_Name is null
Run Code Online (Sandbox Code Playgroud)
这给了我一行中的查询定义,所以当我有这样的评论时
--Some comment
SELECT Column
FROM Somewhere
Run Code Online (Sandbox Code Playgroud)
SQL被注释掉了,我无法使用该定义来创建SP.
如何用适当的换行符解析这个?
或者
有更好的方法来获取这些脚本(使用代码)?
我需要获取PL/SQL过程的参数定义.
在MS SQL上,我们使用Information_schema.Parameters; Oracle中的对应物(如果有的话)是什么?
几乎我所需要的关于数据库的所有信息,我都可以在information_schema中找到
这次我需要通过单一查询读取数据库中所有外键的详细信息我在information_schema.key_Column_usage中找到了所有东西但是找不到constraints like on delete, on update
我可以show create table为所有单独的表做.但有没有办法通过这样的选择查询来获取这些细节?
SELECT CONSTRAINT_NAME, TABLE_NAME,COLUMN_NAME, REFERENCED_TABLE_NAME,
REFERENCED_COLUMN_NAME FROM information_schema.`KEY_COLUMN_USAGE` WHERE
table_schema = 'mydbname' AND referenced_column_name IS NOT NULL
Run Code Online (Sandbox Code Playgroud)
它正在完成这项工作,但只是缺少约束,例如on delete, on update我如何获得这些值,以便我可以在单个查询中获取有关外键的所有信息?
我使用INFORMATION_SCHEMA带有以下查询的视图集列出给定表的所有 FK 约束:
SELECT X.UNIQUE_CONSTRAINT_NAME,
"C".*, "X".*
FROM "INFORMATION_SCHEMA"."KEY_COLUMN_USAGE" AS "C"
INNER JOIN "INFORMATION_SCHEMA"."REFERENTIAL_CONSTRAINTS" AS "X"
ON "C"."CONSTRAINT_NAME" = "X"."CONSTRAINT_NAME"
AND "C"."TABLE_NAME" = 'MY_TABLE'
AND "C"."TABLE_SCHEMA" = 'MY_SCHEMA'
Run Code Online (Sandbox Code Playgroud)
一切正常,但对于一个特定的约束,UNIQUE_CONSTRAINT_NAME列的值是错误的,我需要它以便从引用的列中找到其他信息。基本上,对于大多数行,它UNIQUE_CONSTRAINT_NAME包含引用表中唯一约束(或 PK)FK的名称,但对于一个特定的行,它是其他一些唯一约束的名称。
我放弃并重新创建了 FK - 没有帮助。
我的假设是元数据在某种程度上被搞砸了。有没有办法重建元数据,以便INFORMATION_SCHEMA视图实际显示正确的数据?
编辑 1:示例数据库结构
CREATE TABLE MY_PARENT_TABLE (
ID INTEGER,
NAME VARCHAR,
--//...
CONSTRAINT MY_PARENT_TABLE_PK PRIMARY KEY CLUSTERED (ID)
)
CREATE UNIQUE NONCLUSTERED INDEX MY_PARENT_TABLE_u_nci_ID_LongName ON MY_PARENT_TABLE (ID ASC) INCLUDE (SOME_OTHER_COLUMN)
CREATE TABLE MY_CHILD_TABLE (
ID INTEGER, …Run Code Online (Sandbox Code Playgroud) 嗨,我将此事件存储在信息架构的事件表中:
event_catalog:def
event_schema: m4af
event_name:aggiornaGiorni
definer:root@localhost
timezone:system
event_body:sql
event_definition:update m4af.utentibloccati set giorni=giorni+1
event_type:recurring
execute at: null
interval_value:1
interval_field:day
sql_mode:STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
starts:2012-11-26 11:40:41
ends:null
status:enabled
on_completion:not preserve
created:2012-11-26 11:40:41
last_altered:2012-11-26 11:40:41
last_executed:2012-11-26 11:40:41
event_comment: ""
originator:0
character_set_client:utf8
collocation_connection:utf8_general_ci
database_collation:utf8_general_ci
Run Code Online (Sandbox Code Playgroud)
为什么此事件不会增加名为utentibloccati的表的值日?
这是一个元问题.如何使用INFORMATION_SCHEMA每个数据库提供的方法发现存储过程的返回值?使用函数,显式声明返回值并显示在INFORMATION_SCHEMAunder下ROUTINES.
但是,存储过程似乎是一个奇怪的灰色区域(一直是SP和函数之间的区别).它们似乎正式没有"返回值",但最后你可以运行一个SELECT语句,例如:
SELECT RowID = @RowID;
Run Code Online (Sandbox Code Playgroud)
例如; 在C#中,您从"RowID"列中读取返回值.这清楚地表明存储过程实际上能够返回值,尽管不像函数那样在T-SQL代码的上下文中.
如何在不必解析定义本身的情况下发现这些值及其类型?
编辑
如果要搜索此内容,则存储过程的返回值是隐式的整数,但也可以返回称为结果集的数据.
我有一个想要更改的类型,但我不知道还有谁在使用它。
如何检查返回此类型的所有函数?
我收到此错误:
Run Code Online (Sandbox Code Playgroud)ERROR: structure of query does not match function result type DETAIL: Returned type information_schema.sql_identifier does not match expected type character varying in column 1. CONTEXT: PL/pgSQL function app.get_custom_task_fields(integer,character varying,integer) line 10 at RETURN QUERY
要解决此问题,我需要知道查询中column_name,ordinal_position和的类型。data_type或者更一般地说,列的数据类型是什么information_schema.columns以及如何转换sql_identifier为“可输出”格式以将其从我的函数中取出?
这是我的功能:
CREATE OR REPLACE FUNCTION app.get_custom_task_fields(sess_identity_id int
,session_code_str varchar
,sess_company_id int)
RETURNS TABLE(field_name varchar,ordinal_position integer,field_type varchar)
AS $$
DECLARE
BEGIN
RETURN QUERY
SELECT t.column_name,t.ordinal_position,t.data_type
FROM INFORMATION_SCHEMA.COLUMNS as t
WHERE table_name = 'task_custom' order by …Run Code Online (Sandbox Code Playgroud) 我通过运行此查询来备份所有视图,并将结果存储在表中:
select
TABLE_CATALOG as DBName
, TABLE_NAME as ViewName
, VIEW_DEFINITION as ViewDef
, datalength(VIEW_DEFINITION) as [Length]
, GETDATE() as ImportDate
from INFORMATION_SCHEMA.VIEWS
order by DBName, ViewName
Run Code Online (Sandbox Code Playgroud)
但 VIEW_DEFINITION 列的数据类型设置为 nvarchar(4000) 并且我的一些视图比这长得多 - 因此它们被截断。
我可以以某种方式将 VIEW_DEFINITION 列的数据类型更改为 varchar(max) 吗?
在线搜索,很容易找到获取 SQLite 表中所有列信息的方法:使用table_info(name)带有表名称的 pragma。但我见过的每个 SQL 数据库都有某种方法可以一次性获取整个数据库的所有列的信息,结果集中的某些列链接回拥有相关列的表。
SQLite 支持这个吗?或者只能通过对每个单独的表进行单独的查询来完成?
sql ×3
sql-server ×3
t-sql ×3
mysql ×2
postgresql ×2
c# ×1
constraints ×1
ddl ×1
events ×1
foreign-keys ×1
join ×1
metadata ×1
nvarchar ×1
oracle ×1
plpgsql ×1
plsql ×1
sqlite ×1
system-views ×1
types ×1