Sql 在查询中与引号和双引号混淆
我有一个很好的查询:Sql 在查询中与引号和双引号混淆,sql,sql-server,sql-server-2008,tsql,ssms,Sql,Sql Server,Sql Server 2008,Tsql,Ssms,我有一个很好的查询: CREATE Procedure BCP_Text_File ( @table varchar(100), @FileName varchar(100) ) AS If exists(Select * from information_Schema.tables where table_name=@table) Begin Declare @str varchar(1000) set @st
CREATE Procedure BCP_Text_File
(
@table varchar(100),
@FileName varchar(100)
)
AS
If exists(Select * from information_Schema.tables where table_name=@table)
Begin
Declare @str varchar(1000)
set @str='Exec Master..xp_Cmdshell ''bcp "Select * from '+db_name()+'..'+@table+'" queryout "'+@FileName+'" -c'''
Exec(@str)
end
else
Select 'The table '+@table+' does not exist in the database'
但我需要补充一点:
select column_name
from information_schema.columns
where table_name = @table
order by ordinal_position
到目前为止,我已经:
alter Procedure BCP_Text_File
(
@table varchar(100),
@FileName varchar(100)
)
AS
If exists(Select * from information_Schema.tables where table_name=@table)
Begin
Declare @str varchar(1000)
set @str='Exec Master..xp_Cmdshell ''bcp "
select column_name
from information_schema.columns
where table_name = '+db_name()+'..'+@table+'
order by ordinal_position
Select * from '+db_name()+'..'+@table+'" queryout "'+@FileName+'" -c'''
Exec(@str)
end
else
Select 'The table '+@table+' does not exist in the database'
但是我认为我把单引号和/或双引号放错了。我正在添加这个select语句,以便我的结果将字段名作为第一行
非常感谢您的帮助和指导。也许这就是您想要的?这假设(a)您的列名中没有逗号,(b)当隐式转换为字符串时,每个列的输出都是正常的
ALTER PROCEDURE dbo.BCP_Text_File
@table NVARCHAR(255),
@filename VARCHAR(100)
AS
BEGIN
SET NOCOUNT ON;
IF OBJECT_ID(@table) IS NOT NULL
BEGIN
DECLARE
@sql NVARCHAR(MAX),
@cols NVARCHAR(MAX) = N'';
SELECT @cols += ',' + name
FROM sys.columns
WHERE [object_id] = OBJECT_ID(@table)
ORDER BY column_id;
SELECT @cols = STUFF(@cols, 1, 1, '');
SET @sql = N'EXEC master..xp_cmdshell ''bcp "SELECT '''''
+ REPLACE(@cols, ',', ''''',''''') + ''''' UNION ALL SELECT '
+ 'RTRIM(' + REPLACE(@cols, ',', '),RTRIM(') + ') FROM '
+ DB_NAME() + '..' + @table + '" queryout "' + @filename + '" -c''';
EXEC sp_executesql @sql;
END
ELSE
BEGIN
SELECT 'The table '+@table+' does not exist in the database';
END
END
GO
但我必须同意你从其他人那里得到的关于这个和其他问题的建议——这种方法非常脆弱。你想用蒸汽压路机把开心果碾开
PS我删除了对
INFORMATION\u SCHEMA
的引用,因为我想。调试101:将EXEC(@str)
更改为PRINT(@str)
查询中是否有“…”
?@AaronBertrand抱歉,我无法更改它。我无法编译,你到底想用这个做什么?如果从存储过程中提取代码,则可以更好地进行调试。那么,编译不会阻止您了解问题所在。如果你启用了智能感知,他们甚至可能会让自己变得显而易见。我相信这源于你另一个问题的答案。既然您希望这是自动化的,那么我可以建议您远离SSMS要求,创建一个SQL代理作业吗?有相当多的资源(包括和)非常感谢您您是一个宝藏,但是出现以下错误:未提供用户名,请使用-U提供用户名或使用-T进行可信连接建议您首先使用基本的BCP命令。正如错误消息所建议的,如果您没有使用默认实例和能够启动bcp并重新登录的帐户连接到服务器,则需要添加参数,如-U/-P或-T。我通过将-T放在其中使其工作,非常感谢;但是,我查看了该文件,它没有添加任何逗号,只添加了空格,就像您看到的一样?完全来吧就像我之前建议的那样,首先让一个简单的BCP命令按照您想要的方式工作。我将给您一个提示:您需要为-t
指定不同的内容-默认值是一个选项卡。