【发布时间】: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