Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.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
sys.dm_exec_descripe_first_result_set_通过sp_executesql为_对象生成的结果不一致_Sql_Sql Server_Tsql_Dynamic Sql - Fatal编程技术网

sys.dm_exec_descripe_first_result_set_通过sp_executesql为_对象生成的结果不一致

sys.dm_exec_descripe_first_result_set_通过sp_executesql为_对象生成的结果不一致,sql,sql-server,tsql,dynamic-sql,Sql,Sql Server,Tsql,Dynamic Sql,在SQL Server Management Studio中,我运行了以下查询,该查询试图通过sp_executesql执行动态查询,该查询使用dm_exec_descripe_first_result_set_for_object获取有关某些存储过程的元数据: 声明@SQLString NVARCHAR500=N'SELECT*FROM sys.dm_exec_description_first_result_set_for_objectOBJECT_ID@ProcName,空'; 声明@Pa

在SQL Server Management Studio中,我运行了以下查询,该查询试图通过sp_executesql执行动态查询,该查询使用dm_exec_descripe_first_result_set_for_object获取有关某些存储过程的元数据:

声明@SQLString NVARCHAR500=N'SELECT*FROM sys.dm_exec_description_first_result_set_for_objectOBJECT_ID@ProcName,空'; 声明@ParmDefinition NVARCHAR500=N'@ProcName NVARCHAR500'; 执行sp_executesql@SQLString、@ParmDefinition、@ProcName='[sys].[xxxxxxxx]';-问题1 执行sp_executesql@SQLString、@ParmDefinition、@ProcName='[sys].[sp_index]'.-问题2 执行sp_executesql@SQLString、@ParmDefinition、@ProcName='[sys].[xxxxxxxx]';-问题3 请注意,查询1和查询3都引用了不存在的过程,因此我希望它们返回相同的结果。然而,令人惊讶的是,尽管查询1给出了预期的错误,但查询3给出了与查询2相同的响应

为什么呢

注:

我试了一下:

Windows Server上的SQL Server 2017 Docker中的SQL Server 2017 docker run-e'ACCEPT_EULA=Y'-e'SA_PASSWORD=yourStrong!密码'-p 1433:1433-d mcr.microsoft.com/mssql/server:2017最新版本 Docker中的SQL Server 2019 docker run-e'ACCEPT_EULA=Y'-e'SA_PASSWORD=yourStrong!密码'-p 1433:1433-d mcr.microsoft.com/mssql/server:2019最新版本 这三种情况下的行为都是相同的

如果我不使用动态查询,就不会有这样的问题。也就是说,如果我运行:

从sys.dm_exec_description_first_result_set_中为\u objectOBJECT_ID'[sys].[xxxxxxxx]'选择* 从sys.dm_exec_description_first_result_set_中为_objectOBJECT_ID'[sys].[sp_index]'选择* 从sys.dm_exec_description_first_result_set_中为\u objectOBJECT_ID'[sys].[xxxxxxxx]'选择* 正如预期的那样,查询1和查询3给出了一个错误,而查询2给出了结果


计划缓存似乎很奇怪。解决方法是添加选项重新编译提示:DECLARE@SQLString NVARCHAR500=N'SELECT*FROM sys.dm\u exec\u description\u first\u result\u set\u for\u objectobjectobject_ID@ProcName,空选项重新编译';