为接收到的可变参数创建表和默认列值

Posted

技术标签:

【中文标题】为接收到的可变参数创建表和默认列值【英文标题】:Create a table and default column value to a received variable parameter 【发布时间】:2014-02-24 18:09:14 【问题描述】:

我正在处理一个 MSSQL 存储过程。

我从 c# 服务器收到一个表值参数 (@accountPropsTVP) 和一个变量 (@accountID)。

@accountPropsTVP 有 2 列:

valueTypeID int 值 varchar(max) 注意:我永远不确定此表中有多少行

@accountID 是一个整数

我需要将收到的所有内容合并到一个表中,以便最终看起来像这样:

@temporaryTable:

@accountID(所有行始终相同) valueTypeID 价值

以下是我尝试过的,但出现错误:

消息 112,级别 15,状态 4,过程 insertAccountProps,第 20 行 CREATE TABLE 语句中不允许使用变量。

    CREATE PROCEDURE insertAccountProps 
    -- Received parameters
    @accountID int,
    @accountPropsTVP accountPropsTVP READONLY

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    -- declare new table
    DECLARE @accountPropsTemp TABLE
    (
        accountID int not null DEFAULT (@accountID),
        valueTypeID int not null, 
        value varchar(max) not null
    )

    -- insert received TVP into new temp table, so that we can manipulate it (tvp's are read only :( )
    INSERT INTO
        @accountPropsTemp
    SELECT 
        *
    FROM 
        @accountPropsTVP


    -- select all from TVP and add it into temp table created above
    INSERT INTO
        dbo.accountsProps
    SELECT
        *
    FROM
        @accountPropsTemp
END
GO

也许有更简单的方法?

【问题讨论】:

您没有发布 CREATE TABLE 语句 .... 听起来您可能需要动态 SQL,但没有看到您的 create table 语句,我无法确定解决方案是什么。 他确实发过了,是DECLARE @accountPropsTemp TABLE 错误的措辞让我失望。 【参考方案1】:

您的问题在这里:

DECLARE @accountPropsTemp TABLE
    (
        accountID int not null DEFAULT (@accountID),
        valueTypeID int not null, 
        value varchar(max) not null
    )

您正在分配一个变量作为默认值,正如错误消息明确指出的那样,这是不允许的。

最好的选择是将您的语法更改为:

DECLARE @accountPropsTemp TABLE
(
    accountID int not null,
    valueTypeID int not null, 
    value varchar(max) not null
)


INSERT INTO
    @accountPropsTemp
SELECT 
    @AccountID
    ,ValueTypeID
    ,Value
FROM 
    @accountPropsTVP

【讨论】:

我不知道 Col1、Col2 和 Col3 是从哪里来的 @sunfish 好吧,你没有告诉我们表变量中的列名,所以我把占位符放进去。 我不想听起来很滑稽,但请再看看我的问题,如果我没有告诉你列名,请告诉我。 @sunfish 您没有告诉我们自定义表类型@accountPropsTVP 的列名。我不假设源列名和目标列名相同。我无法知道accountPropsTVP 表类型中有哪些列。 @sunfish 我是个傻瓜,因为我读的是代码而不是上面的 cmets :) 抱歉!

以上是关于为接收到的可变参数创建表和默认列值的主要内容,如果未能解决你的问题,请参考以下文章

python的形参为可变数据类型的坑

函数基础之调用,参数,可变长参数

python——函数重点总结

函数的参数

GO 可变参数

python可变长参数