Joh*_*n M 5 t-sql sql-server file-io ole bcp
我花了一整天的时间在网上搜索答案。显然 tsql 没有自己漂亮的写入文件命令。这是我的困境
我有一个正在创建的加载文件,其中一行的长度可以达到 10K+。SQL Server varchar(MAX) 限制是 8000(所以我相信)所以我把这些行分成几个变量。我尝试进行打印,但窗口窗格允许 4000。解决方法是一次打印一个变量的这些断行,但这对于体力劳动来说可能会变得乏味,所以我选择将其写入 txt 文件中,一次一个变量时间。
我通过 xpcommandshell 研究了 BCP,它看起来很有希望。问题是我可以让这行在命令提示符下工作,但完全相同的行在 TSQL 查询上不起作用:
declare @cmd varchar(8000)
select @cmd = 'bcp Client_DB "Select name from dbo.t_TagBuild_set" queryout "Desktop\LAMB\dummy.txt" -c -t, -T'
exec master..xp_cmdshell @cmd
Run Code Online (Sandbox Code Playgroud)
bcp Client_DB "Select name from dbo.t_TagBuild_set" queryout "Desktop\LAMB\dummy.txt" -c -t, -T 在命令提示符下工作得很好
尽管取得了一点进展,但我的经理不想走那条路。因此,在通过在 SQL 上执行以下行启用 sp_configure 后,我选择了 sp_OACreate 和 sp_OAMethod:sp_configure 'Ole Automation Procedures', 1
这条路线的第一行是这样的:
EXECUTE @hr = sp_OACreate 'Scripting.FileSystemObject' , @objFileSystem OUT
Run Code Online (Sandbox Code Playgroud)
@hr 给出一个 0 所以这很好,但 @objFileSystem 产生 16711422 并且 @hr 最终变成 -2146828218,我认为这是权限。
我真的很找不到简单的事情要做,但我让自己越来越难找到具体的东西,只是在添加新行之前连续写入几个变量并重复该过程。
如果有人能熟练地帮助我找出 BCP 或 sp_OACreate,那么我将非常感激,因为网络几乎没有帮助(这是在我花了很多时间浏览 Microsoft 自己的网站以寻求答案之后)
您的 BCP 不起作用的原因是您使用受信任的用户从 xp_cmdshell 运行它。xp_cmdshell 不在运行脚本的用户下运行。您可以 a) 更改 bcp 命令以使用 sql 登录名/密码,或 b) 创建一个作业来运行它(不是 xp_cmdshell),因为您可以通过使用 run as 和凭据来控制它以哪个用户身份运行。然后,您可以使用 sp_start_job 在脚本中启动作业。
另一个不错的选择是创建一个 SSIS 包,然后通过命令行(例如在 bat 文件中)运行它,或者再次通过作业运行它。
| 归档时间: |
|
| 查看次数: |
20198 次 |
| 最近记录: |