游标内的参数化动态查询导致错误 "Procedure expects parameter '@params' of type 'ntext/nchar/nvarchar'"
Parameterized dynamic query within cursor causes ERROR "Procedure expects parameter '@params' of type 'ntext/nchar/nvarchar'"
我需要获取数据库中每个 table 的最大编辑日期并存储在临时 table 中。光标工作正常但是当我 运行 exec sp_executesql @sql
我得到一个参数期望错误:
Parameterized dynamic query within Cursor gives ERROR Procedure expects parameter '@params' of type 'ntext/nchar/nvarchar'
我做错了什么?
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
你可以在这个post中找到答案
SP_EXECUTESQL and Output Parameter
并且您的 sp_executesql 语句没有参数定义 并且您不必在动态查询中声明变量
declare @MaxVistaEditDate datetime
exec sp_executesql @sql ,N'@MaxVistaEditDateOut datetime OutPut, @MaxVistaEditDateOut=@MaxVistaEditDate OUTPUT
您不必在 sql 字符串上声明变量,您必须在不同的变量上声明,并且您已经有一个(您将其命名为@params)。
更改您对以下内容的@sql定义
SET @SQL = 'Select @MaxVistaEditDate = (SELECT MAX(VistaEditDate) From ' + @SCHEMA + '.' + @TABLE + ')'
并更改您对此的调用:
exec sp_executesql @sql ,@params, @MaxVistaEditDate = @MaxVistaEditDate OUTPUT
它应该可以工作。
注意:不要忘记关闭和释放游标。
我需要获取数据库中每个 table 的最大编辑日期并存储在临时 table 中。光标工作正常但是当我 运行 exec sp_executesql @sql
我得到一个参数期望错误:
Parameterized dynamic query within Cursor gives ERROR Procedure expects parameter '@params' of type 'ntext/nchar/nvarchar'
我做错了什么?
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
你可以在这个post中找到答案 SP_EXECUTESQL and Output Parameter 并且您的 sp_executesql 语句没有参数定义 并且您不必在动态查询中声明变量
declare @MaxVistaEditDate datetime
exec sp_executesql @sql ,N'@MaxVistaEditDateOut datetime OutPut, @MaxVistaEditDateOut=@MaxVistaEditDate OUTPUT
您不必在 sql 字符串上声明变量,您必须在不同的变量上声明,并且您已经有一个(您将其命名为@params)。
更改您对以下内容的@sql定义
SET @SQL = 'Select @MaxVistaEditDate = (SELECT MAX(VistaEditDate) From ' + @SCHEMA + '.' + @TABLE + ')'
并更改您对此的调用:
exec sp_executesql @sql ,@params, @MaxVistaEditDate = @MaxVistaEditDate OUTPUT
它应该可以工作。
注意:不要忘记关闭和释放游标。