获得空输出

Getting Empty Output

我正在尝试执行动态查询,但我变空了Output.Where我错了吗?

SET @SQL=N'
SELECT GETDATE(),'+@AMUID+','+ @BNO + 
',LOT,BARCODEID,'+@ACTWT+',TARE_QUANTITY,''NA'',STAGE,0,0,0,
 '+ @UNAME+ ','+@PR + ',GETDATE()
  FROM DISPENSE_HOLD_START WHERE BATCH_NO='''+@BNO+''' AND BARCODEID='''+ 
  @BARID +'''  and IS_OUT=0';
 PRINT(@SQL)

这里 @AMUID,@BNO,@ACTWT etc 是用 NVARCHAR(MAX) 数据声明的输入参数 type.They 是动态的 我打印这个时什么也得不到。

因为您不是在执行查询而是在打印它 这与 3+3=6 和 "3"+"3"="33"

动态查询通常这样执行(最简单的方法)

DECLARE @IntVariable int;  
DECLARE @SQLString nvarchar(500);  
DECLARE @ParmDefinition nvarchar(500);  

/* Build the SQL string one time.*/  
SET @SQLString =  
     N'SELECT BusinessEntityID, NationalIDNumber, JobTitle, LoginID  
       FROM AdventureWorks2012.HumanResources.Employee   
       WHERE BusinessEntityID = @BusinessEntityID';  
SET @ParmDefinition = N'@BusinessEntityID tinyint';  
/* Execute the string with the first parameter value. */  
SET @IntVariable = 197;  
EXECUTE sp_executesql @SQLString, @ParmDefinition,  
                      @BusinessEntityID = @IntVariable;  
/* Execute the same string with the second parameter value. */  
SET @IntVariable = 109;  
EXECUTE sp_executesql @SQLString, @ParmDefinition,  
                      @BusinessEntityID = @IntVariable;  

案例#1 :

在您的上述查询中,您使用的是 PRINT 而不是 EXEC。所以请确保您在实际代码中执行查询

EXEC(@SQL)

案例#2 :

如果你正在执行这个,有可能如果任何参数值是NULL,那么整个字符串将变成NULL

如果您向 NULL 添加任何值,结果将是 NULL

SELECT
    'ABC',
    'ABC'+NULL

给我这个

所以使用ISNULL

SET @SQL = N'
SELECT 
GETDATE(),
'+ISNULL(@AMUID,'')+','+ISNULL(@BNO,'')+',LOT,
BARCODEID,'+ISNULL(@ACTWT,'')+',TARE_QUANTITY,''NA'',STAGE,0,0,0,
 '+ISNULL(@UNAME,'')+','+ISNULL(@PR,'')+',GETDATE()
  FROM DISPENSE_HOLD_START 
  WHERE BATCH_NO='''+ISNULL(@BNO,'')+''' 
  AND BARCODEID='''+ISNULL(@BARID,'')+'''  
  and IS_OUT=0';
EXEC(@SQL);

案例#3

查看您的代码,我认为您在这里不需要动态 SQL。相反,你可以直接去 Like this

SELECT
    GETDATE(),
    @AMUID,
    @BNO,
    LOT,
    BARCODEID,
    @ACTWT,
    TARE_QUANTITY,
    'NA',
    STAGE,
    0,
    0,
    0,
    @UNAME,
    @PR,
    GETDATE()
    FROM DISPENSE_HOLD_START
       WHERE BATCH_NO = @BNO
          AND BARCODEID = @BARID
          AND IS_OUT = 0

对我来说效果很好

declare @val nvarchar(100) = 'tommy can you see me'
declare @SQL nvarchar(100) = N'SELECT GETDATE(), ''' + @val + '''';
PRINT(@SQL);