Table - 值参数接收无效数据类型错误
Table-Valued Parameter Recieving Invalid Data Type Error
我有一组来自我开发的控制台应用程序的数据,我需要将这些数据传输到 SQL 数据库中。由于 SQL 注入是不稳定的,我决定尝试通过 table 值参数将其传递给存储过程。我创建的 table 类型没有问题,它列在 'User-Defined Table Types' 文件夹下。我遇到的问题是当我尝试创建我的存储过程时,我收到此错误:
Msg 2715, Level 16, State 3, Procedure sp_IsertBackupData, Line 2
[Batch Start Line 0] Column, parameter, or variable #1: Cannot find
data type VeeamTableType. Parameter or variable '@VeeamTableType' has
an invalid data type.
有没有人知道这里可能出现的问题?
我已经尝试刷新本地缓存。
CREATE PROCEDURE sp_IsertBackupData
@VeeamTableType VeeamTableType READONLY
AS
BEGIN
DECLARE @q varchar(1000)
SET @q= 'SELECT * FROM' + @VeeamTableType
INSERT INTO ASManagement.dbo.VeeamBackupResults
(
Id,
Server,
BackupLogFileName,
BackupLogFileSize,
CreatedOn
)
EXEC (@q)
END
SELECT * FROM ASManagement.VeeamBackupResults
CREATE TYPE VeeamBackupResults.VeeamTableType as TABLE
(
Id int primary key,
Server varchar(500) null,
BackupLogFileName varchar (500) null,
BackupLogFileSize float null,
CreatedOn datetime null
)
你不需要动态sql
CREATE PROCEDURE sp_IsertBackupData
@VeeamTableType VeeamTableType READONLY
AS
BEGIN
INSERT INTO ASManagement.dbo.VeeamBackupResults
(
Id,
Server,
BackupLogFileName,
BackupLogFileSize,
CreatedOn
)
SELECT *
FROM @VeeamTableType;
END
Fiddle 创建 proc
出现错误的根本原因是存储过程找不到 VeeamTableType
,因为 你在 VeeamBackupResults
架构下创建它 并且你正在尝试创建默认模式下的过程(dbo
大多数人不会将默认模式更改为另一个模式)
因此,要修复错误,您应该遵循以下解决方案之一:-
1) 在 VeeamBackupResults
模式下创建过程
试试 CREATE PROCEDURE VeeamBackupResults.sp_IsertBackupData
而不是 CREATE PROCEDURE sp_IsertBackupData
或 2) 使用正确的架构传递 VeeamTableType
尝试: @VeeamTableType VeeamBackupResults.VeeamTableType READONLY
而不是: @VeeamTableType VeeamTableType READONLY
或 3) 将用户定义 table 变量创建到默认模式
尝试: CREATE TYPE VeeamTableType as TABLE
而不是: CREATE TYPE VeeamBackupResults.VeeamTableType as TABLE
我有一组来自我开发的控制台应用程序的数据,我需要将这些数据传输到 SQL 数据库中。由于 SQL 注入是不稳定的,我决定尝试通过 table 值参数将其传递给存储过程。我创建的 table 类型没有问题,它列在 'User-Defined Table Types' 文件夹下。我遇到的问题是当我尝试创建我的存储过程时,我收到此错误:
Msg 2715, Level 16, State 3, Procedure sp_IsertBackupData, Line 2 [Batch Start Line 0] Column, parameter, or variable #1: Cannot find data type VeeamTableType. Parameter or variable '@VeeamTableType' has an invalid data type.
有没有人知道这里可能出现的问题?
我已经尝试刷新本地缓存。
CREATE PROCEDURE sp_IsertBackupData
@VeeamTableType VeeamTableType READONLY
AS
BEGIN
DECLARE @q varchar(1000)
SET @q= 'SELECT * FROM' + @VeeamTableType
INSERT INTO ASManagement.dbo.VeeamBackupResults
(
Id,
Server,
BackupLogFileName,
BackupLogFileSize,
CreatedOn
)
EXEC (@q)
END
SELECT * FROM ASManagement.VeeamBackupResults
CREATE TYPE VeeamBackupResults.VeeamTableType as TABLE
(
Id int primary key,
Server varchar(500) null,
BackupLogFileName varchar (500) null,
BackupLogFileSize float null,
CreatedOn datetime null
)
你不需要动态sql
CREATE PROCEDURE sp_IsertBackupData
@VeeamTableType VeeamTableType READONLY
AS
BEGIN
INSERT INTO ASManagement.dbo.VeeamBackupResults
(
Id,
Server,
BackupLogFileName,
BackupLogFileSize,
CreatedOn
)
SELECT *
FROM @VeeamTableType;
END
Fiddle 创建 proc
出现错误的根本原因是存储过程找不到 VeeamTableType
,因为 你在 VeeamBackupResults
架构下创建它 并且你正在尝试创建默认模式下的过程(dbo
大多数人不会将默认模式更改为另一个模式)
因此,要修复错误,您应该遵循以下解决方案之一:-
1) 在 VeeamBackupResults
模式下创建过程
试试 CREATE PROCEDURE VeeamBackupResults.sp_IsertBackupData
而不是 CREATE PROCEDURE sp_IsertBackupData
或 2) 使用正确的架构传递 VeeamTableType
尝试: @VeeamTableType VeeamBackupResults.VeeamTableType READONLY
而不是: @VeeamTableType VeeamTableType READONLY
或 3) 将用户定义 table 变量创建到默认模式
尝试: CREATE TYPE VeeamTableType as TABLE
而不是: CREATE TYPE VeeamBackupResults.VeeamTableType as TABLE