使用变量的SQL替换语句

时间:2016-08-18 07:00:10

标签: sql-server tsql data-cleaning

我想了解一下如何使用SQL替换语句来清理数据,这些新单词保存在单独的表中的两列中。

我正在尝试使用动态SQL和变量来生成替换语句,如下所示:

DECLARE @ReplacementText VARCHAR(max) = 'SELECT UnwantedData FROM Table'

DECLARE @sql VARCHAR(8000) = 'SELECT '

SELECT 
  @sql = @sql + 
  ' @ReplacementText = replace(@ReplacementText, ''' + OldWord + ''', ' + NewWord + ')'
    + ' ,'
FROM ReplacementWords

PRINT @sql

EXEC(@sql)

这是我得到的一个样本:

  

@ReplacementText = replace(@ReplacementText,'“Saiko Maru”',SAIKO MARU)。

加上错误:

  

必须声明标量变量" @ ReplacementText"

感谢有关如何纠正我正在做的事情或更好的解决方法的任何提示。

3 个答案:

答案 0 :(得分:1)

您需要移除块@中的@sql + @ReplacementText = replace(,而不是动态查询中的@ReplacementText,您需要将其作为变量值replace(''' + @ReplacementText + ''', < / p>

工作查询将是:

DECLARE @ReplacementText VARCHAR(max) = 'SELECT UnwantedData FROM Table';
DECLARE @sql VARCHAR(8000) = 'SELECT '

SELECT @sql = @sql + 'ReplacementText = replace(''' + @ReplacementText + ''', ''' + OldWord + ''', ''' + NewWord + ''')' + ' ,'
FROM ReplacementWords

PRINT @sql

EXEC (@sql)

答案 1 :(得分:1)

据我所知,你需要清除SELECT UnwantedData FROM Table这部分内容。

DECLARE @DataToClean NVARCHAR(max)  = 'SELECT UnwantedData FROM Table',
        @ReplacementText NVARCHAR(max),
        @ParmDefinition NVARCHAR(500),
        @sql NVARCHAR(max) = ' @DataToClean, '

;WITH ReplacementWords AS ( --it is a sample of your table with words
SELECT ' “Saiko Maru”' as OldWord,'SAIKO MARU' as NewWord
UNION ALL
SELECT 'UnwantedData', 'Data I want' --this will work for query above
UNION ALL
SELECT 'Some More', 'Yeah'
)

SELECT  @sql = 'replace(' + @sql + '''' + OldWord + ''', ''' + NewWord + '''),'
FROM ReplacementWords

SET @ParmDefinition = N'@DataToClean NVARCHAR(max),@ReplacementText nvarchar(max) OUTPUT'

SELECT @sql = 'SELECT @ReplacementText = ' + STUFF(@sql,LEN(@sql),1,'')

在这部分,您将获得查询:

SELECT @ReplacementText =  replace(replace(replace( @DataToClean, ' “Saiko Maru”', 'SAIKO MARU'),'UnwantedData', 'Data I want'),'Some More', 'Yeah')   

IN @sql变量,然后使用参数执行它:

EXEC sp_executesql @sql, @ParmDefinition, @DataToClean = @DataToClean, @ReplacementText = @ReplacementText OUTPUT

SELECT @ReplacementText

输出:

SELECT Data I want FROM Table

答案 2 :(得分:1)

我在下面给出一个如何做到这一点的例子。

[Test]
public async Task TestReleaseProductsFile()
{
    var bus = Substitute.For<IBus>();
    var returnedProductFiles = Substitute.For<IReleaseProductFiles>();

    // Whenever bus.Send is called with "FileManager.Service" arg, invoke
    // the given callback with the `returnedProductFiles` object.
    // We can then make sure the action updates that object as expected.
    bus.Send<IReleaseProductFiles>(
            "FileManager.Service",
            Arg.Invoke<IReleaseProductFiles>(returnedProductFiles));

    // ... remainder of test ...

    Assert.That(result, Is.TypeOf<OkResult>(), "Status code is not ok");
    Assert.That(returnedProductFiles.FileId, Is.Not.EqualTo(Guid.Empty));
    Assert.That(returnedProductFiles.RequestedDataDate, Is.EqualTo(releaseDate));
    Assert.That(returnedProductFiles.RequestingUser, Is.EqualTo(String.Empty));
}

请注意,为了便于说明,我必须创建#favouriteFoodQuotes作为临时表,否则动态sql将无法运行。但在你的情况下,这是没有问题的,因为你将传递永久表的值。我还创建了一个表变量来保存旧词和新词,但我再次假设这将是永久性的。