首先,我知道通常有大量宽列是一个坏主意,但这是我受限制的格式.
我有一个应用程序,在操作它们并在数据库中插入/更新值之前,将CSV文件导入到临时表中.临时表是动态创建的,具有可变数量的NVARCHAR列,文件将导入其中,另外还有两个INT列用作行ID.
我必须导入的一个特定文件大约有450列.使用大型NVARCHAR列中使用的24字节指针,通过我的计算,这增加了大约10k,我得到了错误Cannot create a row of size 11166 which is greater than the allowable maximum row size of 8060.
有没有办法绕过这个或者是我唯一的选择修改导入器来拆分导入或从文件中删除列?
有类似的问题,但我无法找到这个具体案例的答案.
我正在尝试对列执行替换,以便任何类型的括号内的任何内容都将替换为硬编码字符串.
例如,字符串012345[678]将被更改为.012345[XXXXX]
这应该适用于任何类型的括号,因此012345{678}也将变为012345{XXXXX}.
我一直在尝试使用PATINDEX:
SELECT CASE WHEN PATINDEX('%[([<{]%', column1) = 0
THEN column1
ELSE LEFT(column1, PATINDEX('%[([<{]%', column1))
+ 'XXXXX'
+ SUBSTRING(column1, PATINDEX('%[)>}[]]]%', column1), 1)
END
FROM mytable
Run Code Online (Sandbox Code Playgroud)
这是最后的PATINDEX给我的问题,因为结束方括号结束了由[]语法表示的组.我试图通过将其封装在嵌套括号中来逃避它,但它似乎不起作用.除了为方括号添加额外的案例和使用CHARINDEX之外,我正在画一个空白.有更好的想法吗?
我正在更新表并使用 TSQL OUTPUT 子句添加有关更改的数据。问题是更新后的表只包含我想要输出的数据的规范化 ID,我需要它以人类可读的形式。这是一个简单的例子来说明我的意思
CREATE TABLE LOCATION
(locationid INT, name VARCHAR(50))
CREATE TABLE USER
(userid INT, username VARCHAR(50), locationid INT)
--insert some test data
UPDATE USER
SET locationid = @somevalue
WHERE userid = @someothervalue
Run Code Online (Sandbox Code Playgroud)
我知道我可以添加类似的东西
OUTPUT inserted.username
+ ' location changed from ' + deleted.locationid
+ ' to ' + inserted.locationid
Run Code Online (Sandbox Code Playgroud)
但这对想要知道位置名称而不是其数据库 ID 的最终用户没有用。我尝试替换deleted.locationid为(SELECT name from LOCATION WHERE locationid = deleted.locationid), 并且类似地inserted.locationid遇到了错误Subqueries are not allowed in the OUTPUT clause
我已经看到几个答案说在 OUTPUT 子句中允许连接,但我还没有找到一种在 …
我在表单中有一个日期作为varchar
DD/MM/YYYY HH:MM:SS AM
Run Code Online (Sandbox Code Playgroud)
例如
16/3/2012 4:39:26 PM
Run Code Online (Sandbox Code Playgroud)
我CONVERT()在MSDN页面中看不到有效的格式选项
我错过了什么或者我是否必须先重新格式化varchar字段?
编辑:
更正了格式,抱歉