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

标签 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 脚本。

最佳答案

不可能重现您的问题,但有一个通用技巧可以很好地调试任何 SQL 动态问题。 只需修改您的 SP,之后:

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

插入一行:

PRINT @SQL;

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

关于sql-server - 如何在存储过程中执行动态SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53928291/

相关文章:

java - log4j 未初始化 JDBC 驱动程序

sql-server - 带有默认命名空间的 SQL Server XQuery

SQL Server,在 SQL 中创建临时表时出现问题

sql - 从数据库中的每个表中选择每一行,其中 (columnName = value) 如果列名存在

java存储过程——Oracle中的资源文件

sql - 连接两个表,以便结果显示在多列中

sql-server - 为什么用户定义的表类型的默认值不会保留在数据库中?

sql - 检查字段值是否在 sql server 触发器上更新

c# - 在 C# Visual Studio 中工作时 mysql 存储过程的问题

sql - SQL Server存储过程-插入语法错误