【问题标题】:Table-Valued Parameter Recieving Invalid Data Type Error表值参数接收无效数据类型错误
【发布时间】:2019-08-16 16:18:46
【问题描述】:

我有一组来自我开发的控制台应用程序的数据,我需要将这些数据传输到 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

)

【问题讨论】:

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


    【解决方案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

    【讨论】:

    【解决方案2】:

    你不需要动态 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 创建进程

    【讨论】:

    • 这对问题没有真正的帮助。
    • 见小提琴。编译成功。
    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2017-03-22
    • 2016-03-21
    • 2013-08-04
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    相关资源
    最近更新 更多