Sql server 如何在存储过程中执行动态SQL?
您能帮我在存储过程中编写和执行动态SQL语句吗 我需要在我的数据库中导入许多文件。为了完成这项工作,我使用了“批量插入”。 因此,我创建了一个参数表来存储创建动态“批量插入”所需的参数,具体取决于插入的文件 当用户想要修改或添加要插入到表中的新文件时,此表适用于用户Sql server 如何在存储过程中执行动态SQL?,sql-server,tsql,stored-procedures,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 NVA
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'
我希望存储过程在其内部执行
批量插入脚本。不可能重现您的问题,但有一个通用技巧可以很好地调试任何SQL Dinamic问题。
只需修改您的SP,然后:
SET @SQL_ = ' EXEC ''' + @SQL + ' ;'
插入以下行:
PRINT @SQL;
您将看到正在启动的真正命令。然后,在名为“Messages”的选项卡中,您可以复制该代码,粘贴到另一个查询窗口中并运行它以了解问题所在。只需将查询存储在变量中并使用以下命令即可
EXEC SP\u EXECUTESQL“变量名”
(在您的情况下是@SQL)将执行查询。这是答案。
当我从以下位置声明变量时,我更改了存储过程的开头:
设置@SQL=''
选择@SQL
到
设置@SQL=''
选择@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
您有什么问题?旁注:您当前易受SQL注入攻击。文档中不清楚您是否可以使用参数化查询来实现这一点。如果无法参数化特定变量,则必须将有效值列为白名单,以防止出现问题。请注意,参数化查询将使您不需要为字符串连接强制转换数值列。@我只希望stproed过程执行其中的脚本。我得到的结果只是一个“打印”的查询。这将是一个很好的评论,但不是一个很好的答案。再说一次,这也不是什么好问题……是的,你是对的,调试。打印是VBA,我已经更正了。非常感谢!!!Thks。我得到的结果类似于查询的“打印”。我想要一个“执行”