将 CSV 字符串转换为 T-SQL 中的表的最简洁方法?
-- Given a CSV string like this:
declare @roles varchar(800)
select @roles = 'Pub,RegUser,ServiceAdmin'
-- Question: How to get roles into a table view like this:
select 'Pub'
union
select 'RegUser'
union
select 'ServiceAdmin'
发布这篇文章后,我开始玩一些动态 SQL。这似乎可行,但使用动态 SQL 似乎可能存在一些安全风险 -对此有什么想法吗?
declare @rolesSql varchar(800)
select @rolesSql = 'select ''' + replace(@roles, ',', ''' union select ''') + ''''
exec(@rolesSql)
-- Given a CSV string like this:
declare @roles varchar(800)
select @roles = 'Pub,RegUser,ServiceAdmin'
-- Question: How to get roles into a table view like this:
select 'Pub'
union
select 'RegUser'
union
select 'ServiceAdmin'
After posting this, I started playing with some dynamic SQL. This seems to work, but seems like there might be some security risks by using dynamic SQL - thoughts on this?
declare @rolesSql varchar(800)
select @rolesSql = 'select ''' + replace(@roles, ',', ''' union select ''') + ''''
exec(@rolesSql)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
如果您使用 SQL Server 兼容性级别 130,那么 STRING_SPLIT 函数现在是最简洁的可用方法。
参考链接:https://msdn.microsoft.com/en-gb/library/ mt684588.aspx
用法:
If you're working with SQL Server compatibility level 130 then the STRING_SPLIT function is now the most succinct method available.
Reference link: https://msdn.microsoft.com/en-gb/library/mt684588.aspx
Usage:
请参阅我的回答 这里
但基本上您会:
在数据库中创建此函数:
然后调用该函数并传入要拆分的字符串。
See my answer from here
But basically you would:
Create this function in your DB:
and then call the function and pass in the string you want to split.
以下是对您的选项的全面讨论:
Here's a thorough discussion of your options:
在这种情况下我所做的只是使用一些字符串替换将其转换为 json 并像表一样打开 json。可能并不适合所有用例,但它的运行非常简单并且可以使用字符串和文件。对于文件,您只需要观察换行符,大多数情况下我发现它是“Char(13)+Char(10)”
What i do in this case is just using some string replace to convert it to json and open the json like a table. May not be suitable for every use case but it is very simple to get running and works with strings and files. With files you just need to watch your line break character, mostly i find it to be "Char(13)+Char(10)"
使用 SQL Server 内置的 XML 解析也是一种选择。当然,这掩盖了符合 RFC-4180 的 CSV 的所有细微差别。
如果您使用的是 SQL 2016+,则使用
string_split
更好,但这是 SQL 2016 之前的常见方法。Using SQL Server's built in XML parsing is also an option. Of course, this glosses over all the nuances of an RFC-4180 compliant CSV.
If you are using SQL 2016+, using
string_split
is better, but this is a common way to do this prior to SQL 2016.使用 BULK INSERT,您可以将 csv 文件导入到 sql 表中 -
http://blog.sqlauthority.com/2008/02/06/sql-server-import -csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/
Using BULK INSERT you can import a csv file into your sql table -
http://blog.sqlauthority.com/2008/02/06/sql-server-import-csv-file-into-sql-server-using-bulk-insert-load-comma-delimited-file-into-sql-server/
即使已接受的答案也运行良好。但即使对于数千条记录,我也能更快地获得此功能。创建以下函数并使用。
Even the accepted answer is working fine. but I got this function much faster even for thousands of record. create below function and use.
我是关于您使用已接受的答案中提到的解决方案,但进行更多研究使我使用表值类型:
这些效率更高,并且您不需要 TVF(表值函数)只是为了从 csv 创建一个表。您可以直接在脚本中使用它,或者将其作为表值参数传递给存储过程。类型可以创建为:
I was about you use the solution mentioned in the accepted answer, but doing more research led me to use Table Value Types:
These are far more efficient and you don't need a TVF (Table valued function) just to create a table from csv. You can use it directly in your scripts or pass that to a stored procedure as a Table Value Parameter. The Type can be created as :