假设以下定义:
/// <summary>
/// Replaces each occurrence of sPattern in sInput with sReplace. This is done
/// with the CLR:
/// new RegEx(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace).
/// The result of the replacement is the return value.
/// </summary>
[SqlFunction(IsDeterministic = true)]
public static SqlString FRegexReplace(string sInput, string sPattern,
string sReplace)
{
return new Regex(sPattern, RegexOptions.Multiline).Replace(sInput, sReplace);
}
Run Code Online (Sandbox Code Playgroud)
在一个传递nvarchar(max)值sInput具有长度> 4000将导致被截断的值(即,在调用此UDF的结果是nvarchar(4000)相对于nvarchar(max).
我的SQL-2005数据库中有一列曾经是varchar(max),但它已被更改为nvarchar(max).
现在我需要更新我的hibernate映射文件以反映更改,这就是以前的情况:
<element type ="text"column ="Value"/>
当我尝试运行该应用程序时,出现以下错误:
org.hibernate.HibernateException:列值为[表]中的列类型错误.找到:ntext,expected:text
我应该在'type'属性中将该列正确映射为nvarchar(max)?
我已经尝试将类型设置为ntext,但是hibernate不知道那是什么.我尝试将类型设置为字符串,但它将字符串视为文本类型.
我想创建一个视图,它将显示由不同类型字段连接的两个表的信息.一个字段是nvarchar,另一个是int.我知道我需要在另一种类型中转换一种类型,但不知道该怎么做.任何帮助将不胜感激.
SELECT dbo.co.co_num, dbo.pck_hdr.weight, dbo.STR_ShipTrack.TrackingNumber
FROM dbo.co
INNER JOIN dbo.pck_hdr ON dbo.co.co_num = dbo.pck_hdr.co_num INNER JOIN dbo.STR_ShipTrack ON dbo.pck_hdr.pack_num = dbo.STR_ShipTrack.Reference1
Run Code Online (Sandbox Code Playgroud) 在SQL Server 2008中,我想@wfID在文本中添加一个变量(),如下所示:
DECLARE @wfID uniqueidentifier
SET @wfID = NEWID()
'<META http-equiv="Content-Type" content="text/html; " /> <br><input type="button"
value="" onclick="window.open("http://localhost/TestWeb2/Test_Look.aspx?Test_ID='
+ convert(nvarchar, @wfID)
+ '");" /></br>',
Run Code Online (Sandbox Code Playgroud)
所以,我想添加@wfID到文本,但它总是说
数据类型nvarchar和text在add运算符中不兼容.
我尝试将所有内容转换为nvarchar,但后来我得到了这个:
将表达式转换为数据类型nvarchar的算术溢出错误.
有什么建议?
我在Linq to SQL中发现了一个巨大的性能问题.
使用字符串从表中进行选择时,传递给sql server的参数始终为nvarchar,即使sql表是varchar也是如此.这导致表扫描而不是搜索,这是一个巨大的性能问题.
var q = (
from a in tbl
where a.index == "TEST"
select a)
var qa = q.ToArray();
Run Code Online (Sandbox Code Playgroud)
该参数作为nvarchar传递,这导致整个索引在使用之前从varchar转换为nvarchar.
如果参数是varchar,那么它是一个非常快速的搜索.
有没有办法覆盖或改变这个?
谢谢关心克雷格.
我已经阅读了所有关于varchar与nvarchar的内容.但我没有看到我认为是一个简单问题的答案.如何确定nvarchar柱的长度?对于varchar,它非常简单:例如,我的描述可以包含100个字符,因此我定义了varchar(100).现在我被告知我们需要国际化和支持任何语言.这是否意味着我需要将Description列更改为nvarchar(200),即只需将长度加倍?(而且我忽略了目前国际化所涉及的所有其他问题.)
这么简单吗?
我有一堆NVARCHAR列,我怀疑在VARCHAR列中包含完全可存储的数据.但是,我不能只是将列的类型更改为VARCHAR并希望最好,我需要进行某种检查.
我想进行转换,因为数据是静态的(将来不会改变)并且列被索引并且与实际(nvarchar)索引相比将受益于更小的(varchar)索引.
如果我只是说
ALTER TABLE TableName ALTER COLUMN columnName VARCHAR(200)
Run Code Online (Sandbox Code Playgroud)
那我就不会收到错误或警告.Unicode数据将被截断/丢失.
我该如何检查?
我正在使用FluentNhibernate启动一个简单的.NET项目.
我已经按照我在互联网上找到的几个例子,似乎很容易掌握.
我已经意识到如果我让FluentNhibernate构建我的数据库模式(Sql Server 2000),它会为我的字符串模型属性生成NVARCHAR字段.
有人建议我可以添加一个约定来改变类型.
这段代码效果很好:
public class AnsiStringConvention : IPropertyConvention
{
private static Type stringType = typeof(string);
public void Apply(FluentNHibernate.Conventions.Instances.IPropertyInstance instance)
{
if (instance.Property.PropertyType == stringType)
{
instance.CustomType("AnsiString");
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在我的数据库字段是VARCHAR,正如我预期的那样.
我需要在我的类中添加一个组件,遵循DDD模式我将Address放在一个单独的类中并将其添加到我的Customer类中.
我为地址创建了一个单独的映射文件:
public class AddressMap : ComponentMap<Address>
{
public AddressMap()
{
Map(x => x.Number);
Map(x => x.Street)
.Length(100);
Map(x => x.City)
.Length(50);
Map(x => x.PostCode)
.Length(5);
}
}
Run Code Online (Sandbox Code Playgroud)
现在,我的Customer表的所有字段都是VARCHAR,但Address(Street,City和PostCode)组件的字段仍然创建为NVARCHAR.
我已经定义了一个具有类型参数的存储过程,NVARCHAR(max)我在我的文件中处理该字符串stored procedure.我知道最大值nvarchar是4000.但是我已经将一个包含5700个字符的字符串传递给了我的sp而没有错误.可能吗?
SO 和其他网站上有多个帖子明确指出了最大长度nvarchar(max)为 2GB。然而,我在互联网和现实生活中也看到了很多混乱,它实际上是 Unicode 中的 8000/4000。
我想知道什么事情可以改变这个事实,或者可能导致某人错误地假设这一点。
我已经收集的一些建议/部分答案:
当将nvarchar(max)变量/列分配给非最大尺寸组件的串联时,我们必须将所有内容都nvarchar(max)显式转换吗?下面展示了一个奇怪的示例,其中文本返回函数需要转换,而文字的 N 可以省略:
declare @s nvarchar(max)
select @s = convert(nvarchar(max), replicate('.', 8000)) + N'Hi!'
select len(@s) -- returns 8003
declare @s nvarchar(max)
select @s = replicate('.', 8000) + N'Hi!'
select len(@s) -- returns 4000
declare @s nvarchar(max)
select @s = convert(nvarchar(max), replicate('.', 8000)) + 'Hi!'
select len(@s) -- returns 8003
Run Code Online (Sandbox Code Playgroud)有办法禁用该功能吗?与此有sp_tableoption @OptionName=large value types out of row …
nvarchar ×10
sql ×5
sql-server ×5
t-sql ×2
varchar ×2
c# ×1
clr ×1
conventions ×1
guid ×1
hibernate ×1
indexing ×1
inner-join ×1
int ×1
linq ×1
linq-to-sql ×1
nhibernate ×1
sql-view ×1