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

时间:2014-02-24 18:09:14

标签: sql-server stored-procedures

我正在研究MSSQL存储过程。

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

@accountPropsTVP有两列:

  • valueTypeID int
  • value varchar(max)
  • 注意:我不知道这张表中有多少行

@accountID是一个i​​nt

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

@temporaryTable:

  • @accountID(对所有行始终相同)
  • valueTypeID

以下是我的尝试,但收到错误:

Msg 112,Level 15,State 4,Procedure 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

也许有一种更简单的方法可以做到这一点?

1 个答案:

答案 0 :(得分:9)

您的问题在这里:

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