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 上使用用户定义的表类型的操作数类型冲突