是否在数据库中重复了值?

时间:2018-03-20 11:48:51

标签: sql sql-server

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#后端填充的。

有什么解决方案吗?

1 个答案:

答案 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()作为查询中的标识符。您的示例代码中没有这个,但这是最佳实践。