SQL Server:关于用户定义的表类型的 ltrim

Posted

技术标签:

【中文标题】SQL Server:关于用户定义的表类型的 ltrim【英文标题】:SQL Server: ltrim on User-Defined Table Types 【发布时间】:2016-06-04 11:20:08 【问题描述】:

我有一个 SQL Server 2012 用户定义的表类型,用于从 php 数组获取数据并将该数据传递给过程。有时我会从 Web 应用程序中获得空白,我想使用 ltrim/rtrim 来清理它。我可以在用户定义的表类型级别执行此操作吗? IE:我在哪里声明它应该期待一个 parm1 varchar(10) 我可以以某种方式修剪那里吗?我没有运气。谢谢

例如,我的表格类型如下所示:

CREATE TYPE LocationTableType AS TABLE 
( LocationName VARCHAR(50)
, CostRate INT );
GO

我想更改它,以便当 LocationName 进入时,它会 ltrim()/rtrim() 清除任何多余的空格。

【问题讨论】:

你能不能发一些例子而不是用文字来描述 使用 INSERT/UPDATE trigger 来 LTRIM/RTRIM 位置。另一种方法是使用computed column。将位置名称存储在字段 LocationNameDirty 中,并有一个计算列 LocationName AS RTRIM(LTRIM(LocationNameDirty)) 【参考方案1】:

我假设报告的问题与表值参数的READONLY 属性相关联,该属性是强制性的。这意味着表值参数中的行不能被更新/删除,我们也不能插入其他行。

CREATE PROCEDURE dbo.DoSomething
@list dbo.LocationTableType READONLY -- <-- table table param have to be READONLY
AS 
BEGIN
    SELECT * FROM @list
END

短期解决方案可能是

1)在存储过程中声明另一个变量

2)将修剪后的数据插入到这个变量中,然后

3) 将所有变量的下一个引用更改为新变量的参数。

ALTER PROCEDURE dbo.DoSomething
@list dbo.LocationTableType READONLY
AS 
BEGIN
    DECLARE @listNoSpc dbo.LocationTableType    -- New variable
    INSERT  @listNoSpc (LocationName, CostRate) -- Inserting trimmed data
    SELECT  LTRIM(l.LocationName), l.CostRate
    FROM    @list l

    SELECT * FROM @listNoSpc                    -- Update references from @list to @listNoSpc
END
GO

永久解决方案应该是更新 webapp (PHP) 以在将数据发送到 SQL Server 之前删除这些空格。

【讨论】:

以上是关于SQL Server:关于用户定义的表类型的 ltrim的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server,如何从用户定义的表类型中删除更新元素?

使用 JDBC 将用户定义的表类型传递给 SQL Server 存储过程

使用 JDBC 将用户定义的表类型传递给 SQL Server 存储过程

在 SQL Server 上使用用户定义的表类型的操作数类型冲突

如何在SQL Server中使用用户定义的表类型插入数据时避免重复记录

SQL Server中用户定义的表类型的性能