2010-09-14 70 views
2

字符串NULL我有写的字符串,然后执行使用命令Exec的(字符串)就像一个SQL查询如下:处理是内部的SQL

Declare @TestId bigint = null 
Declare @Query nvarchar(max) 
set @Query = 'SELECT * from Registrations where RegistrationId = 15 AND (' + CAST(@TestId AS NVARCHAR) + ' IS NULL OR TestId = ' + CAST(@TestId AS NVARCHAR) + ') ' 
EXEC(@Query) 

现在的问题是,IS NULL不会被解析正确的内部字符串,但是当我从字符串中删除IS NULL它正常工作,并且@TestId采用非空值时它正常工作现在的问题是在@Query字符串内部的IS NULL的投射。

注意:@TestId是一个过程参数

我需要知道如何让SQL感到IS NULL和提前

+0

您在@Query中构建查询并执行它的任何特定原因?在我看来,这可能是一个直接的SELECT语句,而没有EXEC – LittleBobbyTables 2010-09-14 12:40:11

+0

我公开了部分SQL语句,但它根据特定参数是可变的,所以它不能显式SQL – Ahmy 2010-09-14 12:46:59

回答

4

如果你确实需要使用动态SQL为此,使用sp_executesql的是这样的:

Declare @TestId bigint = null 
Declare @Query nvarchar(max) 
set @Query = 'SELECT * from Registrations where RegistrationId = 15 AND (@TestId IS NULL OR TestId = @TestId)' 

EXECUTE sp_executesql @Query, N'@TestId BIG INT', @TestId 
0

构建动态查询正确分析

谢谢不好,那么...说,你可以通过移动动态查询之外的空检查来处理它,并在那里处理它:

set @Query = 'select * from registrations where registrationId = 15 and 
      CAST(TestId AS NVARCHAR) = ' + ISNULL(CAST(@TestId AS NVARCHAR), '') 

另一个说明,为什么你使用一个动态构建的查询来完成像这样简单的事情?它可能是一个常规的SELECT语句,它会使事情变得复杂得多。

select * from registrations where registrationId = 15 and TestId = @TestId 
+0

如果TestId为空,则动态SQL将导致无效查询。当TestID为空时,第二个查询不会返回任何行,既不是IMO也不是,因为TestID = NULL的结果是UNKNOWN)。 – 2010-09-14 12:43:07

0

从你的代码我怀疑你想要过滤TestId的注册结果,因为它不是null。为什么不用编程方式而不是SQL查询呢?类似的规定(语法我是错的):

Declare @TestId bigint = null 
Declare @Query nvarchar(max) 
if(@TestId IS NULL) 
    set @Query = 'SELECT * from Registrations where RegistrationId = 15' 
else 
    set @Query = 'SELECT * from Registrations where RegistrationId = 15 AND (TestId = ' + CAST(@TestId AS NVARCHAR) + ') ' 
EXEC(@Query) 

此外,贾斯汀Niessner是正确的,动态的SQL是尽可能避免(这可能没有动态SQL来完成)。

+0

我知道这种替代解决方案,但我需要一个解决方案,以便如何在SQL字符串中添加IS NULL,但是我已经使用了这种解决方案,但我需要一个解决方案在字符串内部注入IS NULL。 – Ahmy 2010-09-14 12:50:04

1

对此,您不需要动态SQL。另外,如果您要生成动态SQL,则这样做的好处之一是,您的查询不需要具有这种WHERE TestId [email protected] OR @TestId IS NULL构造,这会导致计划缓存和不必要的表扫描问题。

Declare @TestId bigint = null 
Declare @Query nvarchar(max) 

IF @TestId IS NULL 
SELECT * from Registrations where RegistrationId = 15 
ELSE 
SELECT * from Registrations where RegistrationId = 15 AND TestId [email protected] 

编辑

如下评论,如果你确实需要动态SQL然后使用sp_executesql和产生不同的字符串的情况下@TestId is null。不要将两种情况都放在同一个查询中。

+0

我知道这个替代解决方案,但我需要一个解决方案如何在SQL字符串中添加IS NULL,但这个解决方案我已经在使用,但我需要一个解决方案来注入字符串内的IS NULL – Ahmy 2010-09-14 12:48:46

1

其他的答案提供了解决方案。这就是为什么你的解决方案不起作用。当@TestId为空时,您将null连接到您的@Query字符串,并将null指定给@Query。如果您打印@Query代替exec,您将看到将运行的查询。

Declare @TestId bigint = 10--null 
Declare @Query nvarchar(max) 
set @Query = 'SELECT * from Registrations where RegistrationId = 15 AND (' + CAST(@TestId AS NVARCHAR) + ' IS NULL OR TestId = ' + CAST(@TestId AS NVARCHAR) + ') ' 
--EXEC(@Query) 
print @Query 
+0

+1发现! – 2010-09-14 17:07:12