DECLARE @SQL AS VARCHAR(MAX)
DECLARE @Id1 AS VARCHAR(10) = 'NULL'
SET @sql = ' SELECT * FROM [dbo].[ACCOUNT] WHERE [ACCOUNT_ID] = COALESCE(' + @Id1 + ', [ACCOUNT_ID]) '
EXEC(@sql)
/*------------------------
DECLARE @SQL AS VARCHAR(MAX)
DECLARE @Id1 AS VARCHAR(10) = 'NULL'
SET @sql = ' SELECT * FROM [dbo].[ACCOUNT] WHERE [ACCOUNT_ID] = COALESCE(' + @Id1 + ', [ACCOUNT_ID]) '
EXEC(@sql)
------------------------*/
ACCOUNT_ID DOORS
----------- ------------
2 4
19 2
49 6
66 NULL
(4 row(s) affected)
SET @ID = 'NULL'
SET @sql = 'SELECT * FROM tbl1 WHERE ID = COALESCE(' + @ID + ', ID)'
EXEC(@sql)
PS C:\Users\Administrator> sqlcmd -S . -E
1> DECLARE @SQL NVARCHAR(MAX);
2> DECLARE @ID VARCHAR(10);
3> SET @sql = 'SELECT * FROM sys.objects WHERE object_id = COALESCE(' + COALESCE(@ID,'NULL') + ', object_id)';
4> PRINT (@SQL);
5> EXEC(@sql);
6> GO
SELECT * FROM sys.objects WHERE object_id = COALESCE(NULL, object_id)
name
object_id principal_id schema_id parent_object_id type type_desc
create_date modify_date is_ms_shipped is_published is_schema_published
------------------------------------------------------------------------------------------------------------------------
-------- ----------- ------------ ----------- ---------------- ---- ----------------------------------------------------
-------- ----------------------- ----------------------- ------------- ------------ -------------------
sysrscols
3 NULL 4 0 S SYSTEM_TABLE
2016-04-30 00:44:19.797 2016-04-30 00:44:19.810 1 0 0
sysrowsets
5 NULL 4 0 S SYSTEM_TABLE
2009-04-13 12:59:05.513 2016-04-30 00:44:20.530 1 0 0
sysclones
6 NULL 4 0 S SYSTEM_TABLE
2016-04-30 00:44:20.343 2016-04-30 00:44:20.353 1 0 0
sysallocunits
DECLARE @Numeric INT;
DECLARE @String NVARCHAR(255);
DECLARE @Sql NVARCHAR(MAX);
-- CASE 1 - NUMERIC, has value
SET @Numeric = 123;
SET @Sql = 'SELECT * FROM tbl1' + COALESCE(' WHERE ID = ' + CAST(@Numeric AS NVARCHAR(255)) + ';', ';');
SELECT 1 ,
@Sql;
-- CASE 2 - NUMERIC, no value
SET @Numeric = NULL;
SET @Sql = 'SELECT * FROM tbl1' + COALESCE(' WHERE ID = ' + CAST(@Numeric AS NVARCHAR(255)) + ';', ';');
SELECT 2 ,
@Sql;
-- CASE 3 - STRING, has value
SET @String = 'D''oh!';
SET @Sql = 'SELECT * FROM tbl1' + COALESCE(' WHERE TextCol = ''' + REPLACE(@String, '''', '''''') + ''';', ';');
SELECT 3 ,
@Sql;
-- CASE 4 - STRING, no value
SET @String = NULL;
SET @Sql = 'SELECT * FROM tbl1' + COALESCE(' WHERE TextCol = ''' + REPLACE(@String, '''', '''''') + ''';', ';');
SELECT 4 ,
@Sql;
-- CASE 5 - STRING, no value, IS NULL
SET @String = NULL;
SET @Sql = 'SELECT * FROM tbl1 WHERE TextCol ' + COALESCE('= ''' + REPLACE(@String, '''', '''''') + ''';', 'IS NULL;');
SELECT 5 ,
@Sql;
SELECT * FROM tbl1 WHERE ID = @ID OR @ID IS NULL;
The COALSECE() approach is used for building the SQL string. It is later not part of the resulting SQLIn an original question it is a part of built string, however I haven't discussed that. You're completely right, it should be used to build a dynamic sql string not be a part of it.
/*------------------------
DECLARE @SQL AS VARCHAR(MAX)
DECLARE @Id1 AS VARCHAR(10) = NULL
SET @sql = ' SELECT * FROM [dbo].[ACCOUNT] WHERE [ACCOUNT_ID] = COALESCE(' + ISNULL(@Id1,'NULL') + ', [ACCOUNT_ID]) '
EXEC(@sql)
------------------------*/
ACCOUNT_ID DOORS
----------- ------------
2 4
19 2
49 6
66 NULL
(4 row(s) affected)
'SELECT * FROM tableName WHERE ID =' + @ID
When @ID is NULL then the entire string is NULL. This is the case COALESCE should handle:'SELECT * FROM tableName' + COALESCE(' WHERE ID =' + @ID, '')
SELECT * FROM tbl1 WHERE ID = @ID OR @ID IS NULL;
SELECT * FROM tbl1 WHERE ID = COALESCE(@ID, ID);
You need to put something into that variable, if not, you're putting nothing :)
Open in new window
If you have NULL in @ID, inside you pass NULL literal which is interpreted as NULL keyword.
Regards,
Daniel