给我一个错误,是说“关键字'convert'附近的语法不正确。” 。无法弄清楚如何删除它。
ALTER PROCEDURE [dbo].[sp_convert_unix_timestamp]
@table_name nvarchar(250), ---Staging Table
@DateTimeString nvarchar(max)
AS
BEGIN
if isnull(@DateTimeString,'') <> '' begin
declare @SQLString Nvarchar(max)
declare @UpdateString Nvarchar(max)
declare @initialepoch Nvarchar(10)
set @initialepoch = '19700101'
SELECT @SQLString = coalesce(@SQLString + ',', '') +
'convert(varchar, dateadd(ss, convert(Int, ' + value + '),' + @initialepoch + '), 120)'
FROM STRING_SPLIT(@DateTimeString, ',')
WHERE RTRIM(value) <> ''
select @UpdateString = 'Update [' + @table_name + '] set ' + @SQLString
exec (@SQLString)
end
END
答案 0 :(得分:1)
首先,让我们修复SP,以便它对Injection无效,并且@table_name
的数据类型选择不可用:
ALTER PROCEDURE [dbo].[sp_convert_unix_timestamp]
@table_name sysname, ---Staging Table
@DateTimeString nvarchar(max)
AS
IF ISNULL(@DateTimeString, '') <> ''
BEGIN
DECLARE @SQLString nvarchar(MAX);
DECLARE @UpdateString nvarchar(MAX);
DECLARE @initialepoch nvarchar(10);
SET @initialepoch = N'19700101';
SELECT @SQLString = COALESCE(@SQLString + ',', '') + N'convert(varchar(10), dateadd(ss, convert(Int, ' + QUOTENAME(value,N'''') + N'), + @dinitialepoch), 120)'
FROM STRING_SPLIT(@DateTimeString, ',')
WHERE RTRIM(value) <> '';
SELECT @UpdateString = N'Update ' + QUOTENAME(@table_name) + N' set ' + @SQLString;
PRINT @UpdateString;
EXEC sp_executesql @SQLString, N'@dinitialepoch nvarchar(10)', @dinitialepoch = @initialepoch;
END;
如果我们运行该SP EXEC [dbo].[sp_convert_unix_timestamp] N'MyTable', N'20170720,20170721';
,您将获得此输出(而且很神奇地,您知道其无法运行的原因):
Update [MyTable] set convert(varchar, dateadd(ss, convert(Int, '20170720'), + @dinitialepoch), 120),convert(varchar, dateadd(ss, convert(Int, '20170721'), + @dinitialepoch), 120)
您的SET
子句中没有任何列。您只需拥有UPDATE [Table] SET [Value];
即可,UPDATE
语句的格式为UPDATE [Table] SET [Column] = [Value];
。什么列需要更新,但是,我不知道...