表值参数接收到无效数据类型错误

时间:2019-08-16 16:18:46

标签: sql-server tsql table-valued-parameters

我从开发的控制台应用程序中获取了一系列数据,需要将这些数据传输到SQL数据库中。由于SQL注入是易变的,因此我决定尝试通过表值参数将其传递给存储过程。我创建的表类型没有问题,并且在“用户定义的表类型”文件夹下列出了该表类型。我遇到的问题是,当我尝试创建存储过程时,出现以下错误:

  

消息2715,级别16,状态3,过程sp_IsertBackupData,第2行   [Batch Start Line 0]列,参数或变量#1:找不到   数据类型VeeamTableType。参数或变量“ @VeeamTableType”具有   无效的数据类型。

有人对这里的问题有任何见识吗?

我已经尝试刷新本地缓存。

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

)

2 个答案:

答案 0 :(得分:1)

出现错误的根本原因是存储过程找不到VeeamTableType,因为您在VeeamBackupResults模式下创建了该程序,并且您试图在默认模式下创建该过程({dbo最多不会将默认值更改为其他值)

因此,要纠正该错误,您应该遵循以下解决方案之一:-

1)在VeeamBackupResults模式下创建过程

尝试 CREATE PROCEDURE VeeamBackupResults.sp_IsertBackupData

代替 CREATE PROCEDURE sp_IsertBackupData

或者2)以正确的模式传递VeeamTableType

尝试: @VeeamTableType VeeamBackupResults.VeeamTableType READONLY

代替: @VeeamTableType VeeamTableType READONLY

或3)将用户定义表变量创建为默认架构

尝试: CREATE TYPE VeeamTableType as TABLE

代替: CREATE TYPE VeeamBackupResults.VeeamTableType as TABLE

答案 1 :(得分:0)

您不需要动态sql

https://*.example.com/*pdf*

Fiddle创建proc