SQL Server 存储过程参数类型转换

Posted

技术标签:

【中文标题】SQL Server 存储过程参数类型转换【英文标题】:SQL Server Stored Proc Argument Type Conversion 【发布时间】:2008-10-22 00:21:22 【问题描述】:

假设我在一个表中有一堆 varchar(6000) 字段并且想要将它们更改为文本字段。参数为 varchar(6000) 类型的存储过程的后果是什么。每个存储过程是否也需要更改这些参数数据类型?

【问题讨论】:

【参考方案1】:

在 SQL Server 2005 及更高版本中,文本字段为 deprecated。如果可能,您应该使用 varchar(MAX)。如果您希望在存储过程的参数中传递超过 6000 个字符,那么您也需要更改它们。

【讨论】:

【参考方案2】:

文本字段很难在 SQL Server 中使用。您实际上不能声明文本类型的局部变量(作为存储过程的参数除外),并且大多数字符串操作函数不再适用于文本字段。

此外,如果您有触发器,则文本字段将不会出现在 INSERTED 或 DELETED 表中。

基本上,如果该字段只是保存来自程序的数据并且您没有对其进行操作,那么没什么大不了的。但是,如果您有存储过程来操作字符串,那么您的任务将更加困难。

正如 tvanfosson 所提到的,如果您在 SQL Server 2005 中使用 VARCHAR(MAX),那么您将获得一个文本字段的长度,并且能够像 VARCHAR 一样对其进行操作。

【讨论】:

【参考方案3】:

其他答案是正确的,但它们没有回答您的问题。 Varchar(max) 是要走的路。如果您制作了 feilds varchar(max)/text,但保持存储的 proc 参数相同,则通过存储 proc 进入的任何字段都将被截断为 6000 个字符。既然你说它永远不会超过那个,你会没事的,直到,当然,事实并非如此。它不会引发错误。它只是截断。

我不确定 varchar(max) verses text 的确切行为,但我很确定一旦你开始将它们中的很多放在一个表中,你会得到一些疯狂的性能命中。为什么一张表中有这么多大字段?

【讨论】:

【参考方案4】:

使用文本字段的原因是一行中的所有 varchar(6000) 字段都超过了最大行长度。文本字段只在行中存储一个指针,因此不会超过 SQL Server 的最大行长度 8000。 ATM 数据库无法正常化。数据不会被刚刚插入、更新和删除的存储过程操作。

VARCHAR(MAX) 的行为是否类似于文本字段,并且只存储指向行中数据的指针?

【讨论】:

以上是关于SQL Server 存储过程参数类型转换的主要内容,如果未能解决你的问题,请参考以下文章

怎样在Sql server中创建,执行和删除存储过程

SQL Server存储过程中使用表值作为输入参数示例

SQL Server 存储过程参数 - 不同类型

SQL SERVER 2008 存储过程传表参数

SQL Server 如何执行 带参数的 存储过程

SQL Server中存储过程的创建命令