Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-查找存储过程中的所有插入_Sql_Sql Server_Tsql - Fatal编程技术网

SQL-查找存储过程中的所有插入

SQL-查找存储过程中的所有插入,sql,sql-server,tsql,Sql,Sql Server,Tsql,长期听众,第一次海报。我是SQL新手,正在尝试帮助另一位同事构建一些脚本,以便与测试工具一起使用。我们的目标是在更新应用程序的代码后,使用某种工具根据一组条件检查表,以确保存储过程仍在生成预期的数据 为此我失去你了吗?我正试图找到一种方法来查找给定的存储过程正在更新哪些表以及这些表中的哪些列。我找到了一个脚本,它可以告诉我存储过程使用了哪些表,但我找不到一种方法来同时查找使用了哪些列 这是我用来查找表的工具: WITH stored_procedures AS ( SELECT o.name A

长期听众,第一次海报。我是SQL新手,正在尝试帮助另一位同事构建一些脚本,以便与测试工具一起使用。我们的目标是在更新应用程序的代码后,使用某种工具根据一组条件检查表,以确保存储过程仍在生成预期的数据

为此我失去你了吗?我正试图找到一种方法来查找给定的存储过程正在更新哪些表以及这些表中的哪些列。我找到了一个脚本,它可以告诉我存储过程使用了哪些表,但我找不到一种方法来同时查找使用了哪些列

这是我用来查找表的工具:

WITH stored_procedures AS (
SELECT
o.name AS proc_name, oo.name AS table_name, d.resultobj AS updated,
ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row
FROM sysdepends d 
INNER JOIN sysobjects o ON o.id=d.id
INNER JOIN sysobjects oo ON oo.id=d.depid
WHERE o.xtype = 'P' AND o.name = 'stored_procedure_here')
SELECT table_name FROM stored_procedures
WHERE row = 1 AND updated = 1 
ORDER BY proc_name,table_name 
有什么想法吗?这可能吗


谢谢

您可以创建一个协议表之类的东西,它跟踪所有插入的内容。此协议表将由触发器填充,触发器将在每次插入行时执行

CREATE TRIGGER MyTrigger ON tableName /*Name of table which will have a protocol*/
FOR INSERT
AS

INSERT INTO protocol-table (protocol_id, tableName_id,nameOfTable, GETDATE()) /*protocol_id could be an auto-generated key*/
SELECT NULL, tableName.idField,'tableName', NULL                        /*tableName_id is the ID-Field of the table you protocol*/
FROM inserted /*inserted is a "logical table". Leave this the way it is */

GO
每次对表进行插入时,此插入的ID和受此插入影响的表的名称都会显示在协议中


这样做的缺点是:您必须对每个表执行此操作,您必须确保所有内容都已被协议化。

既然您知道存储过程是什么,请阅读它并查看它写入了哪些表。然后看看是否有新的记录。如果表中有recordCreatedDateTime字段,请使用这些字段。否则,请执行select count*、保留结果、运行应用程序,然后执行另一个select count*。您可能会发现sp_依赖于内置的存储过程。sp_取决于“uspMyStoredProcName”嘿,丹,谢谢你的回复。我明白你的意思,但我有很多需要手动读取的存储过程,所以我试图避免这种情况。嘿,Sql冲浪者,你能再解释一下吗?我不知道你的意思是什么,也不知道这到底是做什么的……为了得到这些专栏,你必须关注代码。您可以利用sysdepends了解涉及哪些表,但对于列级,您必须解析sql,最准确的方法是用眼睛。