sql-server - 在 SET 和 JOIN 子句中使用 TVP 名称

标签 sql-server t-sql stored-procedures sql-server-2008-r2 table-valued-parameters

我在 SQL Server 2008 R2 中需要传入许多行以更新许多行。我决定尝试使用表值参数来完成此任务。首先 - 我在服务器上创建了类型。

CREATE TYPE [dbo].[crm_question_idx_type] AS TABLE(
    [survey_question_id] [int] NOT NULL,
    [row_index] [int] NOT NULL,
     PRIMARY KEY (survey_question_id)
)
GO

一切顺利,但在尝试创建存储过程以使用新类型时出现了问题。创建新过程的代码是:

CREATE PROCEDURE dbo.crm_question_index_update
(
@question_idx dbo.crm_question_idx_type READONLY
)
AS

SET NOCOUNT ON

UPDATE crm_survey_question 
SET crm_survey_question.row_index = @question_idx.row_index
FROM crm_survey_question 
INNER JOIN @question_idx 
    ON crm_survey_question.survey_question_id =  @question_idx.survey_question_id

当我尝试在服务器上编译它时,出现以下错误:

Msg 137, Level 16, State 1, Procedure crm_question_index_update, Line 10
Must declare the scalar variable "@question_idx".

现在在我的代码中 @question_idxdbo.crm_question_idx 类型的输入参数,所以我无法理解为什么会弹出此错误。

最佳答案

别名是你的 friend 。在这种情况下,它们不仅简化了代码量,而且在引用表变量或 TVP 时也需要它们。

UPDATE c
  SET c.row_index = q.row_index
  FROM dbo.crm_survey_question AS c
  INNER JOIN @question_idx AS q
  ON c.survey_question_id = q.survey_question_id;

关于sql-server - 在 SET 和 JOIN 子句中使用 TVP 名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21414908/

相关文章:

sql-server - 插入,但保留空白列?

sql - 对于大量记录来说,动态 sql 存储过程是一件坏事吗?

sql-server - 是否可以从包中启动计划的 Windows 任务?

sql - 如果表不存在则创建

sql-server - SQL : Group by one column, 计算所有行并根据 row_number 保留第二列的值

MySQL临时表不清除

sql - 我需要使用什么 SQL 来列出 Oracle 数据库上的所有存储过程?

sql - Windows 无法在本地计算机上启动 SQL Server (SQLEXPRESS) 服务。错误 1053

sql-server - 如何查找 SQL Azure 中的最大数据库空间和已用数据库空间?

sql-server - Amazon EC2 实例 - 如何查找 SQL Server 密码