如何在存储过程中执行动态SQL?

时间:2018-12-26 06:35:15

标签: sql-server tsql stored-procedures

您能帮我在存储过程中编写和执行动态SQL语句吗?

我需要在数据库中导入许多文件。为此,我使用“批量插入”。 因此,我创建了一个参数表来存储参数,我需要根据插入的文件来创建动态的“批量插入”。

该表适用于想要修改或添加新文件以插入表中的用户。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[usp_Alim_Sas_MCP_Files]
    @FileSource NVARCHAR(100)  
AS
BEGIN
    DECLARE @SQL NVARCHAR(4000) 
    DECLARE @SQL_ NVARCHAR(4000) 

    SET @SQL =''
    SELECT @SQL + 'TRUNCATE TABLE  [Ods].[SRC_MCP_Files];
                    BULK INSERT  [Ods].[Src_MCP_Files]
                    FROM ''' + [FileSource]  + '''  
                    WITH  
                       (DATA_SOURCE = ''' + [DataSource] +''', 
                        DATAFILETYPE = ''' + [DataFileType] + ''',  
                        FIELDTERMINATOR = ''' + [FieldTerminator]  + ''',  
                        ROWTERMINATOR = ''' + [RowTerminator]+ ''',
                        CODEPAGE =  ' + CAST([CodePage] AS NVARCHAR(10))+ ',  
                        FIRSTROW = ' +  CAST([FirstRow] AS NVARCHAR(10)) +', 
                        TABLOCK 
                       );

            INSERT INTO [Ods].[Sas_MCP_Files]
                (ResponseCode, [CountryCode], [CountryLabel], Code, Label,
                 Lang, Lang_2, [DateExtraction], [IdDateExtraction])
                SELECT ResponseCode = ResponseCode+''_''+ [CountryCode] + ''_''+Code , 
            [CountryCode]
                  ,[CountryLabel]
                  ,Code
                  , Label
                 ,  Lang
                  , Lang_2
                  ,[DateExtraction]= getdate ()
                  ,[IdDateExtraction] = convert(int,convert(varchar,getdate(),112)) 
              FROM  [Ods].[SRC_MCP_Files] '

              FROM  [Config].[File_Parameters]
              WHERE FileSource = @FileSource


    EXEC (@SQL)
END;


 EXEC [dbo].[usp_Alim_Sas_MCP_Files] 'temp/mcp/Accompagnists_2.csv'

我希望存储过程在其中执行Bulk Insert脚本。

3 个答案:

答案 0 :(得分:2)

不可能重现您的问题,但是有一个通用技巧可以很好地调试任何SQL Dinamic问题。 只需修改以下内容即可:

SET @SQL_ = ' EXEC ''' + @SQL + ' ;'

插入行:

PRINT @SQL;

您将看到正在启动的实际命令。然后,在名为“消息”的选项卡中,您可以复制该代码,粘贴到另一个查询窗口中并运行它以了解问题所在。

答案 1 :(得分:0)

只需将查询存储在变量中,然后使用以下命令即可。

EXEC SP_EXECUTESQL 'Variable Name'

(在您的情况下为@SQL)将执行查询。

答案 2 :(得分:0)

这就是答案。 当我从中声明变量时,我更改了存储过程的开头: SET @SQL ='' SELECT @SQL

收件人

SET @SQL ='' SELECT @ SQL = @ SQL

这是最终的存储过程:

    /****** Object:  StoredProcedure [dbo].[usp_Alim_Sas_MCP_Files]    Script Date: 02/01/2019 10:51:56 ******/
        SET ANSI_NULLS ON
        GO

        SET QUOTED_IDENTIFIER ON
        GO







        CREATE   PROCEDURE [dbo].[usp_Alim_Sas_MCP_Files]


         @FileSource nvarchar (100) 


         AS

        BEGIN


        DECLARE @SQL NVARCHAR(4000) 


        SET @SQL =''
        SELECT @SQL=@SQL + '
        TRUNCATE TABLE  [Ods].[SRC_MCP_Files];
        BULK INSERT  [Ods].[Src_MCP_Files]
                   FROM ''' + [FileSource]  + '''  
                   WITH  
                   (    
                     DATA_SOURCE = ''' + [DataSource] +''', 
                     DATAFILETYPE = ''' + [DataFileType] + ''',  
                      FIELDTERMINATOR = ''' + [FieldTerminator]  + ''',  
                      ROWTERMINATOR = ''' + [RowTerminator]+ ''',
                     CODEPAGE =  ' + cast ([CodePage] as nvarchar (10))+ ',  
                     FIRSTROW = ' +  cast ([FirstRow] as nvarchar (10)) +', 
                     TABLOCK 
                   ) 
        ;
        INSERT INTO [Ods].[Sas_MCP_Files]
        (   Id
        , ResponseCode
        , [CountryCode]
        ,[CountryLabel]
        ,Code
        , Label
        ,  Lang
        , Lang_2
        ,[DateExtraction]
        ,[IdDateExtraction]
        )
        SELECT  
        Id = '+ cast (Id as nvarchar(10)) +'
        , ResponseCode = ResponseCode+''_''+ [CountryCode] + ''_''+Code , 
        [CountryCode]
              ,[CountryLabel]
              ,Code
              , Label
             ,  Lang
              , Lang_2
              ,[DateExtraction]= getdate ()
              ,[IdDateExtraction] = convert(int,convert(varchar,getdate(),112)) 
          FROM  [Ods].[SRC_MCP_Files] '

          FROM  [Config].[File_Parameters]
          WHERE FileSource = @FileSource


          exec (@SQL)


        END;

        GO