IF EXISTS ( 'SELECT ' +@TextField+','+@ValueField+' FROM ' + @TableName + ' WHERE ' + @TextFieldPara + '=' +@ValueFieldPara + ' ORDER BY ' +@TextField+' ASC;')
BEGIN
SET @Message = @TextField + ' Already Exist...'
END
ELSE
BEGIN
SET @Message = 'TRUE'
END
通过使用此查询,我尝试检查所有表是否为字段重复或不重复插入值。
当我在商店程序中写这个查询时,我在
收到错误IF EXISTS(' SELECT' + @ TextField +',' + @ ValueField +' FROM' + @TableName +' WHERE ' + @TextFieldPara +' =' + @ ValueFieldPara +' ORDER BY' + @ TextField +' ASC;')"
所有变量都是从c#后端填充的。
有什么解决方案吗?
答案 0 :(得分:1)
如果要设置表,则需要动态SQL。这是一种方法:
declare @sql nvarchar(max);
declare @cnt int;
set @sql = '
SELECT @cnt = COUNT(*)
FROM @TableName
WHERE @TextFieldPara = @ValueFieldPara
');
set @sql = replace(@sql, '@TableName', @TableName);
set @sql = replace(@sql, '@TextFieldPara', @TextFieldPara);
set @sql = replace(@sql, '@ValueFieldPara', @ValueFieldPara);
exec sp_executesql(@sql, N'@cnt int output', @cnt=@cnt output);
if (@cnt > 0) . . .
begin
set @Message = @TextField + ' Already Exist...';
end
else
begin
set @Message = 'TRUE';
end;
我简化了查询,因为您不需要select
列表或order by
来确定值的存在。我也使用了count(*)
,因为它更容易表达。如果您关心效果,则有更好的方法,例如case
,其中包含exists
。
同样,您应该使用quotename()
作为查询中的标识符。您的示例代码中没有这个,但这是最佳实践。