无法找出转换SQL附近的错误

时间:2018-07-20 09:36:03

标签: sql sql-server sql-server-2016

给我一​​个错误,是说“关键字'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

1 个答案:

答案 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];。什么列需要更新,但是,我不知道...