当前位置: 首页 > 面试题库 >

SP_EXECUTESQL和输出参数

汝昀
2023-03-14
问题内容

我想从查询中获取ID,但是我得到的是NULL,我的错误在哪里?

DECLARE @TblZimz    NVARCHAR(256)
DECLARE @IdModul    INTEGER
DECLARE @Id         INTEGER

SET @TblZimz        = '_ZIMZ000001'
SET @IdModul        = 1
--SET @Id               = -1

EXECUTE [InsertZimz] @TblZimz, @IdModul, @Id OUTPUT




ALTER PROCEDURE [InsertZimz]
@TblZimz    NVARCHAR(256)
, @IdModul  NVARCHAR(256)
, @Id       INTEGER OUTPUT

            DECLARE @SqlQuery NVARCHAR(MAX)
        SET @SqlQuery = 'SELECT TOP (1) ([ID]) FROM ' + @TblZimz + ' WHERE [ModulId] = ' + @IdModul

        EXEC SP_EXECUTESQL @SqlQuery, N'@Id INTEGER OUTPUT', @Id OUTPUT

为什么@Id参数始终为null?我看不到我的错误?


问题答案:

首先,选择所希望的id使用的输出变量@Id = ([ID])然后分配该@Id OUTPUT中值@Id使用可变@Id = @Id OUTPUT。另外,您应该使用变量在where子句中传递数据,以避免类似sql的注入问题[ModulId] = @IdModul(即,您不应像那样将其串联起来[ModulId] = ' + @IdModul)。试试这个 :

DECLARE @SqlQuery NVARCHAR(MAX)

SET @SqlQuery = 'SELECT TOP (1) @Id = ([ID]) FROM '
                + @TblZimz + ' WHERE [ModulId] = @IdModul'

EXEC SP_EXECUTESQL
  @SqlQuery,
  N'@Id INT OUTPUT, @IdModul INT',
  @IdModul = @IdModul,
  @Id = @Id OUTPUT

在这里查看详细信息SP_EXECUTESQL



 类似资料:
  • 问题内容: 在SQL Server 2014中,我试图创建一个动态的WHERE子句。 我已将查询构建为字符串,但是当我尝试使用sp_executesql执行查询时,出现以下错误:提示 13您必须声明标量变量“ @desde”。 我不知道如何使sp_executesql识别输入参数。 问题答案: 代替 使用 您必须定义在动态查询中使用的参数,例如 请参考sp_executesql 否则,您可以将动态

  • 问题内容: 我使用dapper-dot-net作为ORM,它会产生以下缓慢执行(1700毫秒)的SQL代码。 当我通过删除参数来修改此代码时,查询将以极快的速度(20毫秒)执行。缺少这些参数是否应该造成很大的不同,为什么? 问题答案: 在末尾添加OPTION(RECOMPILE) 我怀疑您正在经历“参数嗅探” 如果是这种情况,我们可以将其留给OPTION或考虑替代方案 更新1 以下文章将向您介绍“

  • 我正在学习如何使用Mybatis。老实说,我很喜欢这个框架。它很容易使用,我对它很满意,因为我可以使用它的sql命令:)我使用MyBatis 3.4.2和PostgreSQL数据库。 例如,我喜欢在插入之前使用注释执行查询是多么容易。如果我在接口方法之前添加一些注释,那么数据映射就像一个迷人的例子,比如:。 我不喜欢的(我希望你能把我引向正确的方向)有以下几点: 使用JDBC时,我需要做到以下几点

  • 我的理解是,当编写gcc样式的内联asm时,您必须非常具体和准确地了解所有的输入和输出参数(和clobbers),这样编译器就会确切地知道如何为代码分配寄存器,以及它可以对那些寄存器的值和asm代码可能读取和/或修改的任何内存假设什么。编译器使用这些信息尽可能地优化周围的代码(如果它认为内联asm对任何东西都没有影响,甚至完全删除它)。对此不够具体可能会导致不正确的行为,因为编译器是根据您的不正确

  • return语句可用于仅从函数返回一个值。 但是,使用output parameters ,您可以从函数返回两个值。 输出参数与参考参数类似,不同之处在于它们将数据传输出方法而不是传输到方法中。 以下示例说明了这一点 - using System; namespace CalculatorApplication { class NumberManipulator { public

  • 问题内容: 我有一个查询,在SQL Server Management STudio中超快,在sp_ExecuteSQL下运行时超慢。 这与在spExecuteSQL下运行时不缓存执行计划有关吗? 问题答案: 不。 您可以看到两个执行计划,并使用以下查询对其进行比较。 该版本将有一个“准备好的”