代码之家  ›  专栏  ›  技术社区  ›  unknown

将xp\u cmdshell作为内联过程调用的存储过程

  •  0
  • unknown  · 技术社区  · 7 年前

    我想当一个dbo。提供所有参数后,将调用generate\u CSV过程,以执行另一个包含xp\u cmdshell的内联存储过程。

    因为它是关于bcp导出的,所以我认为除了使用xp\u cmdshell之外,没有其他方法。

    基本上用户只需调用 生成\u CSV 获取所需输出的步骤。

    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    IF EXISTS ( select * from sysobjects where name ='dbo.generate_CSV ' ) 
    DROP procedure dbo.generate_CSV 
    GO
         CREATE procedure dbo.generate_CSV 
         (
            @dbName varchar(100), 
            @tblName varchar(100),
            @outputPath varchar(100) 
         )
    
    AS
    
    GO
    
       DECLARE @sql varchar(8000)
       SELECT @sql = 'bcp "select * from @dbName..@tblName"' + ' queryout 
       @outputPath -c -t"; " -r"\n" -T -S localhost' --+ @@servername
    
    
    
    --EXEC master..xp_cmdshell @sql
    
    GO
    

    用户唯一关心的是执行此过程。

    EXEC dbo.generate_CSV @dbName = '[dbName]', @tblName = 
    '[tblName]',@outputPath = '[outputPath]'
    

    因此,我的问题是如何在dbo中调用exec xp\u cmdshell。generate\u CSV过程,以便在执行generate\u CSV时,调用bcp copy并获取CSV文件。

    编辑1: 当我删除注释并执行此操作时,我收到以下错误。。。

    SQLState=37000,NativeError=137错误=[Microsoft][SQL Native 客户端][SQL Server]必须声明标量变量“@dbName”。 SQLState=37000,NativeError=8180错误=[Microsoft][SQL Native 无法准备客户端][SQL Server]语句。无效的

    1 回复  |  直到 7 年前
        1
  •  1
  •   sepupic    7 年前

    应通过以下方式连接tblName:

    SELECT @sql = 'bcp "select * from ' + @dbName+ '..' + @tblName + '"' + ' queryout 
       @outputPath -c -t"; " -r"\n" -T -S localhost' --+ @@servername