相关疑难解决方法(0)

如何截断.NET字符串?

我想截断一个字符串,使其长度不超过给定值.我正在写一个数据库表,并希望确保我写的值符合列的数据类型的约束.

例如,如果我可以编写以下内容会很好:

string NormalizeLength(string value, int maxLength)
{
    return value.Substring(0, maxLength);
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这会引发异常,因为maxLength通常会超出字符串的边界value.当然,我可以编写如下的函数,但我希望这样的东西已经存在.

string NormalizeLength(string value, int maxLength)
{
    return value.Length <= maxLength ? value : value.Substring(0, maxLength);
} 
Run Code Online (Sandbox Code Playgroud)

执行此任务的难以捉摸的API在哪里?有吗?

.net c# string truncate

379
推荐指数
19
解决办法
28万
查看次数

SQL Server以静默方式截断存储过程中的varchar

根据这个论坛的讨论,SQL Server(我使用2005但我收集这个也适用于2000和2008)默认将varchar你指定的任何s指定为varchar的长度,即使直接插入该字符串也是如此.INSERT实际上会导致错误.例如.如果我创建此表:

CREATE TABLE testTable(
    [testStringField] [nvarchar](5) NOT NULL
)
Run Code Online (Sandbox Code Playgroud)

然后当我执行以下内容时:

INSERT INTO testTable(testStringField) VALUES(N'string which is too long')
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

String or binary data would be truncated.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

大.保留了数据完整性,并且调用者知道它.现在让我们定义一个存储过程来插入:

CREATE PROCEDURE spTestTableInsert
    @testStringField [nvarchar](5)
AS
    INSERT INTO testTable(testStringField) VALUES(@testStringField)
GO
Run Code Online (Sandbox Code Playgroud)

并执行它:

EXEC spTestTableInsert @testStringField = N'string which is too long'
Run Code Online (Sandbox Code Playgroud)

没有错误,1排受影响.将一行插入表中,testStringField格式为'strin'.SQL Server以静默方式截断存储过程的varchar参数.

现在,这种行为有时可能很方便,但我认为没有办法把它关掉.这非常烦人,因为如果我将一个字符串传递给存储过程,我希望错误.似乎有两种方法可以解决这个问题.

首先,将存储过程的@testStringField参数声明为大小为6,并检查其长度是否超过5.这看起来像是一个黑客攻击并涉及大量的样板代码.

其次,只需声明所有存储过程varchar参数varchar(max),然后让INSERT存储过程中的语句失败.

后者似乎工作正常,所以我的问题是:varchar(max)在SQL …

sql sql-server stored-procedures truncate truncation

67
推荐指数
2
解决办法
4万
查看次数

标签 统计

truncate ×2

.net ×1

c# ×1

sql ×1

sql-server ×1

stored-procedures ×1

string ×1

truncation ×1