Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在查询中与引号和双引号混淆_Sql_Sql Server_Sql Server 2008_Tsql_Ssms - Fatal编程技术网

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
指定不同的内容-默认值是一个选项卡。