【问题标题】:Parameterized dynamic query within cursor causes ERROR "Procedure expects parameter '@params' of type 'ntext/nchar/nvarchar'"游标内的参数化动态查询导致错误“程序需要'ntext/nchar/nvarchar'类型的参数'@params'”
【发布时间】:2020-10-13 00:19:24
【问题描述】:

我需要获取数据库中每个表的最大编辑日期并存储在临时表中。光标工作正常,但是当我运行 exec sp_executesql @sql 时,我得到一个参数期望错误:

Cursor 中的参数化动态查询给出错误过程需要类型为“ntext/nchar/nvarchar”的参数“@params”

我做错了什么?

SET NOCOUNT ON

IF OBJECT_ID('tempdb..##GetMaxVistaEditDate') IS NOT NULL 
    DROP TABLE ##GetMaxVistaEditDate

CREATE TABLE ##GetMaxVistaEditDate 
(
     MySchema nvarchar(max), 
     MyTable nvarchar(max),  
     MaxVistaEditDate DateTime
)

-- SELECT * FROM ##GetMaxVistaEditDate

DECLARE MyCursor CURSOR FOR
    SELECT 
        SCHEMA_NAME(t.schema_id) Schemaname,
        t.name AS TableName
    FROM 
        sys.tables t 
    WHERE  
        Schema_Name(t.Schema_id) like 'R_PERS%'

OPEN MyCursor

DECLARE @Schema VARCHAR(100), @Table VARCHAR(100), @MaxVistaEditDate DATETIME
DECLARE @sql NVARCHAR(MAX) = '', @params NVARCHAR(MAX);

SET @params = N'@MaxVistaEditDate DateTime OUTPUT';

FETCH FROM MyCursor INTO @Schema, @Table

WHILE @@FETCH_STATUS = 0
BEGIN   
    SET @SQL = 'DECLARE @MaxVistaEditDate DATETIME SELECT @MaxVistaEditDate =  (SELECT MAX(VistaEditDate) FROM ' + @SCHEMA + '.' + @TABLE   + ')'   

    EXEC sp_executesql @sql, @MaxVistaEditDate OUTPUT
    -- PRINT @SQL
    -- PRINT @MaxVistaEditDate

    INSERT INTO ##GetMaxVistaEditDate 
        SELECT @Schema, @Table, @MaxVistaEditDate

    FETCH FROM MyCursor INTO @Schema, @Table
END

CLOSE MyCursor
DEALLOCATE MyCursor

【问题讨论】:

  • MySQL 还是 SQL Server?它们是完全不同的产品,具有完全不同的 SQL 变体。
  • 假设 SQL Server 我建议阅读 official docs 并将他们的示例与您的示例进行比较。

标签: sql-server tsql dynamic-sql


【解决方案1】:

你不必在 sql 字符串上声明变量,你必须在另一个变量上做,你已经有一个变量(你把它命名为@params)。

为以下内容更改您的@sql 定义

SET @SQL = 'Select @MaxVistaEditDate =  (SELECT MAX(VistaEditDate)   From  ' + @SCHEMA + '.' + @TABLE    + ')'   

并改变你的呼吁:

exec sp_executesql @sql ,@params, @MaxVistaEditDate = @MaxVistaEditDate OUTPUT

它应该可以工作。

注意:不要忘记关闭并释放游标。

【讨论】:

  • 我在您之前尝试了另一个答案,但出现了更多错误。你的回答正好解决了我的问题。非常感谢!
【解决方案2】:

你可以在这篇文章中找到答案 SP_EXECUTESQL and Output Parameter 并且您的 sp_executesql 语句没有参数定义,并且您不必在动态查询中声明变量

declare @MaxVistaEditDate datetime
exec sp_executesql @sql ,N'@MaxVistaEditDateOut datetime OutPut,  @MaxVistaEditDateOut=@MaxVistaEditDate OUTPUT

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 2020-01-28
    • 2014-12-07
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-14
    相关资源
    最近更新 更多