存储过程中打印TABLE TYPE参数报错:必须声明标量变量@mydata
问题原因与解决方法
错误Must declare the scalar variable "@mydata"的核心原因是:@mydata是自定义表类型的参数,属于表集合变量,而PRINT语句只能处理标量值(单个字符串、数字等),不能直接输出表类型变量。
修正方案1:直接查询表中的JSON数据
如果只是需要查看传入的JSON响应内容,用SELECT语句查询表变量的列即可:
CREATE TYPE [dbo].[apidata] AS TABLE ( [response] [nvarchar](max) NULL ) CREATE PROCEDURE [dbo].[usp_API] ( @mydata dbo.apidata READONLY ) AS BEGIN -- 直接查询表中的JSON响应 SELECT response FROM @mydata; END GO
修正方案2:遍历表变量并逐个PRINT
如果必须用PRINT输出每条JSON内容,可以通过游标遍历表变量:
CREATE TYPE [dbo].[apidata] AS TABLE ( [response] [nvarchar](max) NULL ) CREATE PROCEDURE [dbo].[usp_API] ( @mydata dbo.apidata READONLY ) AS BEGIN DECLARE @single_json nvarchar(max); -- 声明游标遍历表中的每条JSON DECLARE json_cursor CURSOR FOR SELECT response FROM @mydata; OPEN json_cursor; FETCH NEXT FROM json_cursor INTO @single_json; -- 循环输出每条JSON WHILE @@FETCH_STATUS = 0 BEGIN PRINT @single_json; FETCH NEXT FROM json_cursor INTO @single_json; END CLOSE json_cursor; DEALLOCATE json_cursor; END GO
调用存储过程示例
使用表类型参数时,需要先声明表变量并赋值,再传入存储过程:
-- 声明表类型变量 DECLARE @input_json dbo.apidata; -- 插入API返回的JSON数据 INSERT INTO @input_json (response) VALUES ('{"code":200,"msg":"success"}'), ('{"code":400,"msg":"error"}'); -- 调用存储过程 EXEC dbo.usp_API @mydata = @input_json;
内容的提问来源于stack exchange,提问作者Bala
相关产品推荐
相关产品推荐

