小编Pre*_*cco的帖子

使用 *tables* 作为表值参数 (TVP)

MS SQL 2008 支持 TVP:一种将数据批量上传到存储过程进行处理的有用功能。

是否可以利用现有的表定义,而不是创建用户定义的类型?例如,是否可以创建具有以下签名的存储过程?

CREATE PROCEDURE usp_InsertProductionLocation
@TVP **LocationTable** READONLY
Run Code Online (Sandbox Code Playgroud)

文档似乎表明这是不可能的。

示例代码

/*
Sample code from:
http://msdn.microsoft.com/en-us/library/bb510489.aspx
*/

USE AdventureWorks2008R2;
GO

/* Create a table type. */
CREATE TYPE LocationTableType AS TABLE 
( LocationName VARCHAR(50)
, CostRate INT );
GO

/* Create a procedure to receive data for the table-valued parameter. */
CREATE PROCEDURE usp_InsertProductionLocation
    @TVP LocationTableType READONLY
    AS 
    SET NOCOUNT ON
    INSERT INTO [AdventureWorks2008R2].[Production].[Location]
           ([Name]
           ,[CostRate]
           ,[Availability]
           ,[ModifiedDate])
        SELECT *, 0, GETDATE()
        FROM  @TVP;
        GO

/* Declare …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008

20
推荐指数
1
解决办法
8305
查看次数

UPSERT - 有没有更好的替代 MERGE 或 @@rowcount 的方法?

不知道大家有没有遇到过类似UPSERT这个概念的T-SQL命令?使用选项 (1) 或 (2) 执行 INSERT|UPDATE 操作似乎过于复杂且容易出错。

客观的

确保所需的记录(在本例中为 employee_id 1)是最新的,而不必实质上编写相同的查询两次。

语境

  • 表名:员工
  • 员工id:有主键,身份属性设置为true

选项

  1. 执行 SQL UPDATE... 检查 @@rowcount = 0 和 @@error = 0 ... 如果需要,执行 SQL INSERT

    • 缺点:您实际上必须两次编写相同的查询,一次作为插入,一次作为更新
    • con: more code = more time typing
    • con: more code = more room for error

/sf/ask/77470221/ "Update using @@rowcount"

  1. execute a SQL MERGE
    • con: you effectively have to write the same query twice, once as an insert, once as an update
    • con: more code = more time typing
    • con: …

sql-server-2008 upsert

15
推荐指数
1
解决办法
3万
查看次数

标签 统计

sql-server-2008 ×2

upsert ×1