【问题标题】:Set Variable shows different result SQL设置变量显示不同的结果 SQL
【发布时间】:2019-12-12 12:44:30
【问题描述】:

我试图做一个存储过程,声明变量并设置它的值,但它显示的值与我设置的值不同。

CREATE PROCEDURE [dbo].[sp_InsertAccount]
    @OldAccount AS VARCHAR(25),
    @NewAccount AS VARCHAR(25),
    @TableName AS VARCHAR(25)
AS
    DECLARE @SQL VARCHAR(MAX)
    DECLARE @TableName_ sysname

    SET @OldAccount = '7006-0090-0280'
    SET @NewAccount ='5555-0090-0280'
    SET @TableName_ = 'cust'

    SELECT @NewAccount

    SELECT @SQL = COALESCE(@SQL + ', ', '') + Name 
    FROM sys.columns
    WHERE OBJECT_ID = OBJECT_ID(@TableName_)
      AND name NOT IN ('custnum');

    SELECT @SQL = 'SELECT '+ @NewAccount+','+@OldAccount+',' + @SQL + ' FROM '   + @TableName_+' where custnum ='''+@OldAccount+''''
    EXEC (@SQL)
GO

【问题讨论】:

  • 这里有一个提示:5555 - 90 - 280 = 5185 和 7006 - 90 - 280 = 6636。
  • @ErikPhilips..哦,它变成了一个公式?...即使我将其声明为 varchar....您可以提供任何解决方案吗?...谢谢
  • 它是动态 SQL,它周围没有单引号,因此它假定它是数学。基本上你说的是Select 5555 - 90 - 280 而不是Select '5555-0090-0280'。话虽如此,最好使用parameterized query。
  • SELECT @SQL = 'SELECT '''+ @NewAccount+''', '''+@OldAccount+''',' + @SQL + ' FROM ' + @TableName_+' where custnum ='''+@OldAccount+''''
  • 现在知道了,谢谢..您可以添加上一条评论作为答案。并且不赞成它谢谢

标签: sql sql-server


【解决方案1】:

您是动态查询,值周围没有引号,因此 SQL 标准响应是使用数学。

例子

'SELECT '+ @NewAccount

产量

SELECT 5555 - 90 - 280

这样做的正确方法

SELECT ''' + @NewAccount + ''''

话虽这么说,您应该非常小心使用动态 sql,允许外部源构建自己的查询是自找麻烦。防止某些问题的一种方法是使用Parameterized Queries。

【讨论】:

    【解决方案2】:

    如果你要去print(@sql),这会给你。

    SET @SQL = 'SELECT '+ @NewAccount+','+@OldAccount+',' + @SQL + ' FROM ' + @TableName_+' where custnum ='''+@OldAccount+''''
    print @SQL
    
    
    SELECT 5555-0090-0280,7006-0090-0280, .... FROM tname_cust where custnum ='7006-0090-0280'
    

    所以它会给你区别,而不是字符串。

    将您最后的 @sql 语句更改为:

    SELECT @SQL = 'SELECT '''+ @NewAccount+''', '''+@OldAccount+''',' + @SQL + ' FROM ' + @TableName_+' where custnum ='''+@OldAccount+''''
    

    输出:

    SELECT '5555-0090-0280', '7006-0090-0280', .... FROM tname_cust where custnum ='7006-0090-0280'
    

    将您的variables 视为string 而不是算术表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-28
      • 2013-04-13
      • 2017-04-16
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多