我正在为我没有预先提供数据类型信息的表生成T-SQL SELECT语句.在这些语句中,我需要执行依赖于表列原始值长度的字符串操作操作.
一个例子(但不是唯一的例子)是在字符串中的特定位置插入一些文本,包括在末尾插入它的选项:
SELECT
CASE WHEN (LEN ([t0].[Product] = 8)
THEN [t0].[Product] + 'test'
ELSE STUFF ([t0].[Product], 8, 0, 'test')
END
FROM [OrderItem] [t0]
Run Code Online (Sandbox Code Playgroud)
(CASE WHEN + LEN是必需的,因为STUFF不允许我在字符串的末尾插入文本.)
问题是LEN排除了尾随空白,这将破坏计算.我知道我可以使用DATALENGTH,它不排除尾随空格,但是我无法将DATALENGTH返回的字节转换为STUFF所需的字符,因为我不知道Product列是varchar还是nvarchar类型.
那么,如何在没有关于正在使用的字符串数据类型的前期信息的情况下生成依赖于字符串的确切长度的SQL语句?
我有一个SQL Server 2008 R2表与nvarchar(4000)字段.
存储此表的数据看起来像
'696D616765206D61726B65643A5472'
要么
'303131' ("011").
我看到每个char都编码为十六进制.
如何从表中读取这些数据?我不想写解码功能,我的意思是存在更简单的方法.
PS抱歉我的英文.
我试图插入?并?进入其中列类型的符号表nvarchar.
这是可能的还是SQL Server中不允许使用这些符号?
我们有一个索引列(ModelName),它在表中非常重要,与"目录号"非常相似,但它不是PK.
很多ORDER by ModelName; WHERE ModelName等,正在使用.
该列最初以as开头 NVarchar(50),但随着时间的推移将大小更改为100,现在需要为255.
我发现了很多帖子"NVarchar(MAX) vs. NVarChar(N)",但我无法得到确凿的答案:
在索引中使用NVarchar(255)而NVarchar(100)不是NVarchar(50)特别使用而不是特别的性能?
在性能方面,较短的柱尺寸(50)是否比较长的柱(255)更好?并且可以对此类索引进行特殊设置以提高性能吗?
以下是@a_horse_with_no_name在评论中提供的另一个参考:
请注意Ariel的答案:https://stackoverflow.com/a/8295195/1140885
在哪里说:
"具体来说,在进行排序时,较大的列会占用更多空间,因此如果这会损害性能,那么您需要担心它并使它们变小."
,并在评论中:
"还有一些问题和限制需要考虑.当所有四列都是VARCHAR(255)时,你不能拥有(a,b,c,d)索引"
没有明确的结论/参考文档等.
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作为我的文本列的数据类型(用于unicode支持).虽然我不期望非英语文本,但我认为最好从一开始就支持它以防万一.
我有什么理由坚持使用普通varchar吗?性能?
我在oracle 10g数据库中有以下"翻译"表:
ID VARCHAR2(100 BYTE)
LANGUAGE CHAR(2 BYTE)
COUNTRY CHAR(2 BYTE)
TRANSLATION NVARCHAR2(2000 CHAR)
TRACK_TIMESTAMP DATE
TRACK_USER VARCHAR2(2000 BYTE)
Run Code Online (Sandbox Code Playgroud)
当我尝试这样做时:
update translation set translation = 'œ' where id = 'MY_ID' And language = 'fr';
Run Code Online (Sandbox Code Playgroud)
然后我运行这个:
select * from translation where id = 'MY_ID' and language = 'fr';
Run Code Online (Sandbox Code Playgroud)
翻译栏显示:S而不是,œ我不明白为什么.
由于遗留问题,我无法将整个数据库转换为使用UTF-8,还有其他选择吗?
目前国家字符集是AL16UTF16.普通字符集是WE8ISO8859P1.
我目前正在使用java 1.6
以上是一个简化的例子.以下是我的实际应用程序中的查询:
UPDATE TRANSLATION SET TRANSLATION=? WHERE TRANSLATION.COUNTRY=? and TRANSLATION.ID=? and TRANSLATION.LANGUAGE=? 1=1,800 - 2,500 œufs par heure 2=CA 3=3_XT_FE_ECS18 4=fr
Run Code Online (Sandbox Code Playgroud)
这里的问题是不添加œufs它添加¿ufs
我有下一个问题:
--DECLARE @TEST NVARCHAR(MAX)
--DECLARE @TEST2 NVARCHAR(MAX)
DECLARE @TEST NTEXT
DECLARE @TEST2 NTEXT
Run Code Online (Sandbox Code Playgroud)
NVARCHAR(MAX)对于执行存储过程时需要放入的文本量要小,同样,TEXT,NTEXT和IMAGE数据类型对局部变量无效,我该怎么做才能回避这个问题并存储超大文本喜欢.
提前致谢
我正在建立一个图书馆管理系统,我正在尝试在我的项目中添加阿拉伯语支持,但我面临的困难如下,
通过Query在SQL中插入数据时,即Insert into book_info values(25, N'????', N'Author',N'Publisher',2014,N'Subject',50,N'Language','Latest',5)book_info中的列列表如下所示
因此,当我通过我的项目执行此查询时,SQL Management Studio显示一些编码字符'مجتبیٰ'代替阿拉伯字符,而不仅仅是SQL Management Studio在项目中选择数据时.注:在查询这些值取自textfield通过.getText()功能
如果我们只是在执行查询跳过第一个问题SQL Management Studio,这样做的第一个问题是暂时解决了SQL Management Studio被示出了选择的数据,但再次,当我们从我们的软件选择,并显示在当阿拉伯字符Textfield从获取数据ResultSet像" TextF.setText(ResultS.getNString())"它??????在文本字段中显示" "代替阿拉伯字符.
我的表包含三列。如果我NVARCHAR(MAX)在 select 语句中选择列,我会发现性能很差。是否可以在列上创建索引NVARCHAR(MAX)?
CREATE TABLE TEST
(
id primary key,
product VARCHAR(50),
Title NVARCHAR(max)
)
INSERTING MILLIONS OF RECORDS....
SELECT product, Title
FROM TEST
Run Code Online (Sandbox Code Playgroud)
该表包含数百万条记录。如何为该列创建索引?它真的能提高我的 select 语句的性能吗?或者有其他方法可以改善这个问题吗?