我想了解一下如何使用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"
感谢有关如何纠正我正在做的事情或更好的解决方法的任何提示。
答案 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将无法运行。但在你的情况下,这是没有问题的,因为你将传递永久表的值。我还创建了一个表变量来保存旧词和新词,但我再次假设这将是永久性的。