A constant expression was encountered in the ORDER BY list - sql

Below is my dynamic query and it's not working.
It threw:
A constant expression was encountered in the ORDER BY list, position 2.
Original dynamic query:
SET #QueryVendorName = ';WITH
cteForPriceVen AS (select AI.ItemID, AI.ItemPartNumber as ItemPartNumber, AI.ItemDescription, cteForPrice.VendorPrice as Price, cteForPrice.UpdatedDate as UpdatedDate, cteForPrice.IsLocked as IsLocked
from AerospaceItems (nolock) AI
inner join VendorItemPricing (nolock) cteForPrice
on AI.ItemPartNumber = cteForPrice.ItemPartNumber where cteForPrice.VendorName = ''' + #VendorName + ''' AND
cteForPrice.ObsoleteItem = ''' + cast (#ItemType as char(1)) + ''') select * from cteForPriceVen'
SET #OrderQuery = '
WHERE (''' + cast (#Description as varchar(250)) + ''' = '''' OR cteForPriceVen.ItemDescription like ''%' + cast (#Description as varchar(250)) + '%'')
AND (''' + cast (#PartNumber as varchar(99)) + ''' = '''' OR cteForPriceVen.ItemPartNumber like ''%' + cast (#PartNumber as varchar(99)) + '%'')
AND (''' + cast (#PriceFrom as varchar(25)) + ''' = '''' OR Price >= ''' + cast (#PriceFrom as varchar(99)) + ''')
AND (''' + cast (#PriceTo as varchar(25)) + ''' = '''' OR Price <= ''' + cast (#PriceTo as varchar(99)) + ''')
AND (''' + cast (#DateFrom as varchar(25)) + ''' = '''' OR UpdatedDate >= ''' + cast (#DateFrom as varchar(99)) + ''')
AND (''' + cast (#DateTo as varchar(25)) + ''' = '''' OR UpdatedDate <= ''' + cast (#DateTo as varchar(99)) + ''')
ORDER BY
CASE WHEN '''+ #OrderBy +'''=''ItemDescription'' AND '''+ cast (#OrderMode as varchar(10)) +'''= ''0'' THEN cteForPriceVen.ItemDescription END ASC,
CASE WHEN '''+ #OrderBy +'''=''ItemDescription'' AND '''+ cast (#OrderMode as varchar(10)) +'''= ''1'' THEN cteForPriceVen.ItemDescription END DESC,
CASE WHEN '''+ #OrderBy +'''=''ItemPartNumber'' AND '''+ cast (#OrderMode as varchar(10)) +'''= ''0'' THEN cteForPriceVen.ItemPartNumber END ASC,
CASE WHEN '''+ #OrderBy +'''=''ItemPartNumber'' AND '''+ cast (#OrderMode as varchar(10)) +'''= ''1'' THEN cteForPriceVen.ItemPartNumber END DESC,
CASE WHEN '''+ #OrderBy +'''=''Price'' AND '''+ cast (#OrderMode as varchar(10)) +'''= ''0'' THEN Price END ASC,
CASE WHEN '''+ #OrderBy +'''=''Price'' AND '''+ cast (#OrderMode as varchar(10)) +'''= ''1'' THEN Price END DESC,
CASE WHEN '''+ #OrderBy +'''=''UpdatedDate'' AND '''+ cast (#OrderMode as varchar(10)) +'''= ''0'' THEN UpdatedDate END ASC,
CASE WHEN '''+ #OrderBy +'''=''UpdatedDate'' AND '''+ cast (#OrderMode as varchar(10)) +'''= ''1'' THEN UpdatedDate END DESC'
Extracted Query:
;WITH
cteForPriceVen AS (select AI.ItemID, AI.ItemPartNumber as ItemPartNumber, AI.ItemDescription, cteForPrice.VendorPrice as Price, cteForPrice.UpdatedDate as UpdatedDate, cteForPrice.IsLocked as IsLocked
from AerospaceItems (nolock) AI
inner join VendorItemPricing (nolock) cteForPrice
on AI.ItemPartNumber = cteForPrice.ItemPartNumber where cteForPrice.VendorName = 'Apple' AND
cteForPrice.ObsoleteItem = '0') select * from cteForPriceVen
WHERE ('' = '' OR cteForPriceVen.ItemDescription like '%%')
AND ('' = '' OR cteForPriceVen.ItemPartNumber like '%%')
AND ('' = '' OR Price >= '')
AND ('' = '' OR Price <= '')
AND ('' = '' OR UpdatedDate >= '')
AND ('' = '' OR UpdatedDate <= '')
ORDER BY
CASE WHEN 'ItemDescription'='ItemDescription' AND '0'= '0' THEN cteForPriceVen.ItemDescription END ASC,
CASE WHEN 'ItemDescription'='ItemDescription' AND '0'= '1' THEN cteForPriceVen.ItemDescription END DESC
If I remove second order by line, CASE WHEN 'ItemDescription'='ItemDescription' AND '0'= '1' THEN cteForPriceVen.ItemDescription END DESC the query seems working.

The second line:
CASE WHEN 'ItemDescription'='ItemDescription' AND '0'= '1' THEN cteForPriceVen.ItemDescription END DESC
Is equivalent to NULL. You can't order something by NULL.
edit
If this statement is being generated by a dynamic query, what you need to do is fix the way you build the dynamic query:
#orderQuery = ' ORDER BY '
IF #OrderBy = 'ItemDescription'
BEGIN
orderQuery += ' cteForPriceVen.ItemDescription '
orderQuery += CASE WHEN #OrderMode = 1 THEN 'ASC' ELSE 'DESC' END
END

This line just doesn't make sense:
CASE WHEN 'ItemDescription'='ItemDescription' AND '0'= '0'
shouldn't it be something like:
CASE WHEN variableName = 'Value' ...

Related

when generate select statement it give me strange text as > when select data?

I work on SQL server 2012 I face issue : there are generated strange text when select from #Body
as ">"
How to remove that and why is generated ?
this signature as > do problem for me when do select data
select #Body from table
it give me error incorrect syntax near ';'
sample data :
create table #FinalTable
(
PART_ID nvarchar(50) ,
CompanyName nvarchar(50),
PartNumber nvarchar(50),
DKFeatureName nvarchar(100),
value nvarchar(50),
StatusId int,
DisplayOrder int,
splitFlag bit
)
insert into #FinalTable(
PART_ID ,
CompanyName ,
PartNumber ,
DKFeatureName ,
value ,
StatusId ,
DisplayOrder ,
splitFlag)
values
('1222','Honda','silicon','package','15.50Am',2,5,0),
('1900','MERCEIS','GLASS','family','90.00Am',2,2,1),--have column per Unit on #Header because FlagAllow=1
('5000','TOYOTA','alominia','source','70.20kg',2,1,0),
('8000','MACDA','motor','parametric','50.40kg',2,3,1),--have column per Unit on #Header because FlagAllow=1
('8900','JEB','mirror','noparametric','75.35kg',2,4,0)
DECLARE #Body NVARCHAR(MAX)
SELECT
#Body = STUFF(
(
SELECT ', ' + case when A.splitFlag = 1 and a.value<> '-' and (a.Value is not null) then 'LEFT(' + QUOTENAME (A.DKFeatureName) + ',PATINDEX(''%[^0-9.]%'',' + QUOTENAME (A.DKFeatureName) + '+ ' + ''' ''' + ')-1) as ['+A.DKFeatureName+'],(CASE WHEN PATINDEX(''%[^0-9.]%'', '+ A.DKFeatureName + ') > 0 THEN RIGHT('+ QUOTENAME (A.DKFeatureName) +',LEN('+ QUOTENAME (A.DKFeatureName) +') - PATINDEX(''%[^0-9.]%'','+ QUOTENAME (A.DKFeatureName) +')+1)) ELSE NULL END) as ['+A.DKFeatureName +'Units'+']' else quotename(A.DKFeatureName) end
FROM #FinalTable A
where StatusId=2
ORDER BY A.DisplayOrder
FOR XML PATH ('')
),1,2,''
)
print #Body
string generated as below :
[Series], [Cable Type], LEFT([Impedance],PATINDEX('%[^0-9.]%',[Impedance]+ ' ')-1) as [Impedance],(CASE WHEN PATINDEX('%[^0-9.]%', Impedance) > 0 THEN RIGHT([Impedance],LEN([Impedance]) - PATINDEX('%[^0-9.]%',[Impedance])+1)) ELSE NULL END) as [ImpedanceUnits], LEFT([Frequency - Max],PATINDEX('%[^0-9.]%',[Frequency - Max]+ ' ')-1) as [Frequency - Max],(CASE WHEN PATINDEX('%[^0-9.]%', Frequency - Max) > 0 THEN RIGHT([Frequency - Max],LEN([Frequency - Max]) - PATINDEX('%[^0-9.]%',[Frequency - Max])+1)) ELSE NULL END) as [Frequency - MaxUnits], [Color]
Expected result gt must be > and remove semi colon and &
[Series], [Cable Type], LEFT([Impedance],PATINDEX('%[^0-9.]%',[Impedance]+ ' ')-1) as [Impedance],(CASE WHEN PATINDEX('%[^0-9.]%', Impedance) > 0 THEN RIGHT([Impedance],LEN([Impedance]) - PATINDEX('%[^0-9.]%',[Impedance])+1)) ELSE NULL END) as [ImpedanceUnits], LEFT([Frequency - Max],PATINDEX('%[^0-9.]%',[Frequency - Max]+ ' ')-1) as [Frequency - Max],(CASE WHEN PATINDEX('%[^0-9.]%', Frequency - Max) > 0 THEN RIGHT([Frequency - Max],LEN([Frequency - Max]) - PATINDEX('%[^0-9.]%',[Frequency - Max])+1)) ELSE NULL END) as [Frequency - MaxUnits], [Color]
I need display gt& as > 0
You need to use the TYPE key word to enforce the characters to be retained, and then extract the value of your text in the generated XML instead using value:
DECLARE #Body nvarchar(MAX);
SELECT #Body = STUFF((SELECT ', ' + CASE
WHEN A.splitFlag = 1
AND A.value <> '-'
AND (A.Value IS NOT NULL) THEN 'LEFT(' + QUOTENAME(A.DKFeatureName) + ',PATINDEX(''%[^0-9.]%'',' + QUOTENAME(A.DKFeatureName) + '+ ' + ''' ''' + ')-1) as [' + A.DKFeatureName + '],(CASE WHEN PATINDEX(''%[^0-9.]%'', ' + A.DKFeatureName + ') > 0 THEN RIGHT(' + QUOTENAME(A.DKFeatureName) + ',LEN(' + QUOTENAME(A.DKFeatureName) + ') - PATINDEX(''%[^0-9.]%'',' + QUOTENAME(A.DKFeatureName) + ')+1)) ELSE NULL END) as [' + A.DKFeatureName + 'Units' + ']'
ELSE QUOTENAME(A.DKFeatureName)
END
FROM #FinalTable A
WHERE StatusId = 2
ORDER BY A.DisplayOrder
FOR XML PATH(''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,2,'');
PRINT #Body;

SQL Server: Conversion failed when converting date and/or time from character string

I want to check if the columns of a table contain null value and if so assign the 0 value. I had problem because there where UniqueIdentifier column existing. So I change my code to assign '0' value. But now I have a problem when there is DateTime column.
Here is the code:
Select #sql = #sql + 'Case when IsNull(i.[' + Column_Name +
'],''0'') = IsNull(d.[' + Column_name + '],''0'') then ''''
else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +'
from information_schema.columns
where table_name = 'Users' and column_name <>'rowguid' and column_name <>'modifieddate'
Another failed attempt:
Select #sql = #sql +
'Case
when IsDate(i.['+Column_Name+']) =1 and IsDate(d.['+Column_Name+']) =1 and IsNull(i.[' + Column_Name + '],1/1/1900) = IsNull(d.[' + Column_name + '],1/1/1900)
then ''''
when IsNull(i.[' + Column_Name + '],''0'') = IsNull(d.[' + Column_name + '],''0'')
then ''''
else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +'
from information_schema.columns
where table_name = 'Users' and column_name <>'rowguid' and column_name <>'modifieddate'
Full code:
if #Action = 'U'
BEGIN
Select #sql = #sql +
'Case when IsNull(i.[' + Column_Name +
'],' + CASE DATA_TYPE
WHEN 'int' THEN '0'
WHEN 'bigint' THEN '0'
WHEN 'tinyint' THEN '0'
WHEN 'uniqueidentifier' THEN '''0'''
WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
WHEN 'date' THEN CHAR(39) + '1/1/1900' + CHAR(39)
WHEN 'datetime' THEN CHAR(39) + '1/1/1900 00:00:00' + CHAR(39)
ELSE ''
END + ') = IsNull(d.[' + Column_name + '],'+
CASE DATA_TYPE
WHEN 'int' THEN '0'
WHEN 'bigint' THEN '0'
WHEN 'tinyint' THEN '0'
WHEN 'uniqueidentifier' THEN '''0'''
WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
WHEN 'date' THEN CHAR(39) + '1/1/1900' + CHAR(39)
WHEN 'datetime' THEN CHAR(39) + '1/1/1900 00:00:00' + CHAR(39)
ELSE ''
END + ') then ''''
else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +'
from information_schema.columns
where table_name = 'Users' and column_name <>'rowguid' and column_name <>'modifieddate'
--Define output parameter
set #ParmDefinition = '#OutString varchar(max) OUTPUT'
--Format sql
set #sql = 'Select #OutString = '
+ Substring(#sql,1 , len(#sql) -1) +
' From dbo.Users i ' --Will need to be updated for target schema
+ ' inner join #tempTrigT d on
i.id = d.id' --Will need to be updated for target schema
--Execute sql and retrieve desired column list in output parameter
exec sp_executesql #sql, #ParmDefinition, #OutString OUT
Here an example how a corresponding CASE might look like -however, it is NOT complete and you might want to extend / redesign it a little:
Select #sql = #sql + 'Case when IsNull(i.[' + Column_Name +
'],' + CASE DATA_TYPE
WHEN 'int' THEN '0'
WHEN 'bigint' THEN '0'
WHEN 'tinyint' THEN '0'
WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
WHEN 'date' THEN CHAR(39) + '1900-01-01' + CHAR(39)
ELSE ''
END + ') = IsNull(d.[' + Column_name + '],'+
CASE DATA_TYPE
WHEN 'int' THEN '0'
WHEN 'bigint' THEN '0'
WHEN 'tinyint' THEN '0'
WHEN 'varchar' THEN CHAR(39) + '-' + CHAR(39)
WHEN 'nvarchar' THEN CHAR(39) + '-' + CHAR(39)
WHEN 'date' THEN CHAR(39) + '1900-01-01' + CHAR(39)
ELSE ''
END + ') then ''''
else ' + quotename(Column_Name, char(39)) + ' + '',''' + ' end +'
from information_schema.columns

generate DDL script from SQL Server database

How to generate DDL (with Foreign keys, indexes, etc.) script of all tables from SQL Server database using SQL (select/stored procedure/etc.)? i need everything except the data.
I can't use Sql Server Management Studio because i want to use it in a node.js script that will run over linux!
For tables : (you can work as follows)
DECLARE #C VARCHAR(200)
DECLARE C CURSOR FOR
SELECT 'EXEC [DBO].[SP_GETDDL] '''+NAME+'''' FROM SYS.TABLES
OPEN C
FETCH NEXT FROM C INTO #C
WHILE ##FETCH_STATUS=0
BEGIN
EXEC (#C)
FETCH NEXT FROM C INTO #C
END
CLOSE C
DEALLOCATE C
The Procedure is as follows:
CREATE PROCEDURE [dbo].[Sp_getddl] #TBL VARCHAR(255)
AS
BEGIN
SET nocount ON
DECLARE #TBLNAME VARCHAR(200),
#SCHEMANAME VARCHAR(255),
#STRINGLEN INT,
#TABLE_ID INT,
#FINALSQL VARCHAR(max),
#CONSTRAINTSQLS VARCHAR(max),
#CHECKCONSTSQLS VARCHAR(max),
#RULESCONSTSQLS VARCHAR(max),
#FKSQLS VARCHAR(max),
#TRIGGERSTATEMENT VARCHAR(max),
#EXTENDEDPROPERTIES VARCHAR(max),
#INDEXSQLS VARCHAR(max),
#vbCrLf CHAR(2)
SET #vbCrLf = Char(13) + Char(10)
SELECT #SCHEMANAME = Isnull(Parsename(#TBL, 2), 'dbo'),
#TBLNAME = Parsename(#TBL, 1)
SELECT #TABLE_ID = [object_id]
FROM sys.objects
WHERE [type] = 'U'
AND [name] <> 'dtproperties'
AND [name] = #TBLNAME
AND [schema_id] = Schema_id(#SCHEMANAME);
IF Isnull(#TABLE_ID, 0) = 0
BEGIN
SET #FINALSQL = 'Table object [' + #SCHEMANAME + '].['
+ Upper(#TBLNAME)
+ '] does not exist in Database ['
+ Db_name() + ']'
SELECT #FINALSQL;
RETURN 0
END
SELECT #FINALSQL = 'CREATE TABLE [' + #SCHEMANAME + '].['
+ Upper(#TBLNAME) + '] ( '
SELECT #TABLE_ID = Object_id(#TBLNAME)
SELECT #STRINGLEN = Max(Len(sys.columns.[name])) + 1
FROM sys.objects
INNER JOIN sys.columns
ON sys.objects.[object_id] = sys.columns.[object_id]
AND sys.objects.[object_id] = #TABLE_ID;
SELECT #FINALSQL = #FINALSQL + CASE WHEN sys.columns.[is_computed] = 1
THEN
#vbCrLf +
'[' + Upper(
sys.columns.[name]) + '] ' + Space(#STRINGLEN -
Len(sys.columns.[name])) + 'AS ' +
Isnull(CALC.definition, '') ELSE
#vbCrLf + '[' + Upper(sys.columns.[name]) + '] '
+
Space(
#STRINGLEN - Len(sys.columns.[name])) +
Upper(Type_name(sys.columns.[user_type_id])) +
CASE
WHEN
Type_name(sys.columns.[user_type_id]) IN (
'decimal',
'numeric') THEN '(' + CONVERT(
VARCHAR, sys.columns.[precision]) + ',' +
CONVERT(
VARCHAR,
sys.columns.[scale]) + ') ' + Space(6 - Len(
CONVERT(
VARCHAR,
sys.columns.[precision]) + ',' +
CONVERT(VARCHAR, sys.columns.[scale]))) + Space(
2)
-- + SPACE(16 - LEN(TYPE_NAME(sys.columns.[user_type_id])))
+ CASE WHEN Columnproperty ( #TABLE_ID,
sys.columns.[name],
'IsIdentity' ) = 0 THEN ' ' ELSE
' IDENTITY(' +
CONVERT(VARCHAR, Isnull(Ident_seed(#TBLNAME), 1)
)
+
',' +
CONVERT(VARCHAR, Isnull(Ident_incr(#TBLNAME), 1)
)
+
')' END
+ CASE WHEN sys.columns.[is_nullable] = 0 THEN
' NOT NULL'
ELSE ' NULL' END WHEN
Type_name(sys.columns.[user_type_id]) IN (
'float',
'real')
THEN CASE WHEN
sys.columns.[precision] = 53 THEN Space(11 -
Len(CONVERT(VARCHAR, sys.columns.[precision])))
+
Space(7) +
Space(16 -
Len(Type_name(sys.columns.[user_type_id]))) +
CASE
WHEN
sys.columns.[is_nullable] = 0 THEN
' NOT NULL' ELSE ' NULL' END ELSE '(' +
CONVERT(
VARCHAR,
sys.columns.[precision]) + ') ' + Space(6 - Len(
CONVERT(
VARCHAR, sys.columns.[precision]))) + Space(7) +
Space
(16
- Len(Type_name(sys.columns.[user_type_id]))) +
CASE
WHEN
sys.columns.[is_nullable] = 0 THEN ' NOT NULL'
ELSE
' NULL' END
END WHEN Type_name(sys.columns.[user_type_id])
IN
(
'char',
'varchar') THEN CASE WHEN
sys.columns.[max_length]
=
-1 THEN
'(max)' + Space(6 -
Len(CONVERT(VARCHAR, sys.columns.[max_length])))
+
Space(7) +
Space(16 -
Len(Type_name(sys.columns.[user_type_id]))) +
CASE
WHEN
sys.columns.collation_name IS NULL THEN ''
ELSE ' COLLATE ' + sys.columns.collation_name
END
+
CASE WHEN
sys.columns.[is_nullable] = 0 THEN ' NOT NULL'
ELSE
' NULL' END ELSE '(' +
CONVERT(VARCHAR, sys.columns.[max_length]) +
') '
+
Space(6 -
Len(CONVERT(VARCHAR, sys.columns.[max_length])))
+
Space(7) +
Space(16 -
Len(Type_name(sys.columns.[user_type_id]))) +
CASE
WHEN
sys.columns.collation_name IS NULL THEN ''
ELSE ' COLLATE ' + sys.columns.collation_name
END
+
CASE WHEN
sys.columns.[is_nullable] = 0 THEN ' NOT NULL'
ELSE
' NULL' END END WHEN
Type_name(sys.columns.[user_type_id]) IN (
'nchar',
'nvarchar'
) THEN CASE WHEN
sys.columns.[max_length] = -1 THEN '(max)' +
Space
(6 -
Len(CONVERT(VARCHAR, (sys.columns.[max_length]))))
+
Space(7)
+ Space(16 - Len(Type_name(
sys.columns.[user_type_id]))) + CASE WHEN
sys.columns.collation_name IS NULL THEN '' ELSE
' COLLATE ' +
sys.columns.collation_name END + CASE WHEN
sys.columns.[is_nullable] = 0 THEN
' NOT NULL' ELSE ' NULL' END ELSE '(' +
CONVERT(
VARCHAR,
(sys.columns.[max_length])) + ') ' + Space(6 - Len
(
CONVERT(
VARCHAR, (sys.columns.[max_length])))) + Space(7)
+
Space(16
- Len(Type_name(sys.columns.[user_type_id]))) +
CASE
WHEN
sys.columns.collation_name IS NOT NULL THEN ''
ELSE
' COLLATE ' +
sys.columns.collation_name END + CASE WHEN
sys.columns.[is_nullable]
= 0 THEN ' NOT NULL' ELSE ' NULL' END END WHEN
Type_name(
sys.columns.[user_type_id]) IN ('datetime',
'money',
'text',
'image') THEN Space(18 -
Len(Type_name(sys.columns.[user_type_id]))) +
' ' + CASE WHEN
sys.columns.[is_nullable] = 0 THEN ' NOT NULL'
ELSE
' NULL' END ELSE Space(16
- Len(Type_name(sys.columns.[user_type_id]))) +
CASE
WHEN
Columnproperty ( #TABLE_ID, sys.columns.[name],
'IsIdentity'
) = 0 THEN ' ' ELSE ' IDENTITY(' +
CONVERT(
VARCHAR, Isnull(Ident_seed(#TBLNAME), 1) ) + ',' +
CONVERT(
VARCHAR, Isnull(Ident_incr(#TBLNAME), 1) ) + ')'
END +
Space(
2) + CASE WHEN sys.columns.[is_nullable] = 0 THEN
' NOT NULL'
ELSE ' NULL' END END + CASE WHEN
sys.columns.[default_object_id] = 0 THEN ''
--ELSE ' DEFAULT ' + ISNULL(def.[definition] ,'')
--optional section in case NAMED default cosntraints are needed:
ELSE #vbCrLf + 'CONSTRAINT [' + def.NAME + '] DEFAULT ' +
Isnull(def.[definition], '')
--i thought it needed to be handled differently! NOT!
END --CASE cdefault
END --iscomputed
+ ','
FROM sys.columns
LEFT OUTER JOIN sys.default_constraints DEF
ON sys.columns.[default_object_id] = DEF.[object_id]
LEFT OUTER JOIN sys.computed_columns CALC
ON sys.columns.[object_id] = CALC.[object_id]
AND sys.columns.[column_id] = CALC.[column_id]
WHERE sys.columns.[object_id] = #TABLE_ID
ORDER BY sys.columns.[column_id]
SELECT #STRINGLEN = Max(Len([name])) + 1
FROM sys.objects
DECLARE #Results TABLE
(
[schema_id] INT,
[schema_name] VARCHAR(255),
[object_id] INT,
[object_name] VARCHAR(255),
[index_id] INT,
[index_name] VARCHAR(255),
[rows] INT,
[sizemb] DECIMAL(19, 3),
[indexdepth] INT,
[type] INT,
[type_desc] VARCHAR(30),
[fill_factor] INT,
[is_unique] INT,
[is_primary_key] INT,
[is_unique_constraint] INT,
[index_columns_key] VARCHAR(max),
[index_columns_include] VARCHAR(max)
)
INSERT INTO #Results
SELECT sys.schemas.schema_id,
sys.schemas.[name]
AS schema_name,
sys.objects.[object_id],
sys.objects.[name]
AS object_name,
sys.indexes.index_id,
Isnull(sys.indexes.[name], '---')
AS index_name,
partitions.rows,
partitions.sizemb,
Indexproperty(sys.objects.[object_id], sys.indexes.[name],
'IndexDepth')
AS
IndexDepth,
sys.indexes.type,
sys.indexes.type_desc,
sys.indexes.fill_factor,
sys.indexes.is_unique,
sys.indexes.is_primary_key,
sys.indexes.is_unique_constraint,
Isnull(Index_Columns.index_columns_key, '---')
AS index_columns_key,
Isnull(Index_Columns.index_columns_include, '---')
AS index_columns_include
FROM sys.objects
JOIN sys.schemas
ON sys.objects.schema_id = sys.schemas.schema_id
JOIN sys.indexes
ON sys.objects.[object_id] = sys.indexes.[object_id]
JOIN (SELECT [object_id],
index_id,
Sum(row_count) AS
Rows,
CONVERT(NUMERIC(19, 3), CONVERT(NUMERIC(19, 3), Sum(
in_row_reserved_page_count
+ lob_reserved_page_count
+
row_overflow_reserved_page_count
)) /
CONVERT(NUMERIC(19, 3), 128)) AS
SizeMB
FROM sys.dm_db_partition_stats
GROUP BY [object_id],
index_id) AS partitions
ON sys.indexes.[object_id] = partitions.[object_id]
AND sys.indexes.index_id = partitions.index_id
CROSS apply (SELECT LEFT(index_columns_key,
Len(index_columns_key) - 1)
AS
index_columns_key
,
LEFT(index_columns_include, Len(index_columns_include) - 1) AS
index_columns_include
FROM (SELECT (SELECT sys.columns.[name] + ',' + ' '
FROM sys.index_columns
JOIN sys.columns
ON sys.index_columns.column_id = sys.columns.column_id
AND sys.index_columns.[object_id] =
sys.columns.[object_id]
WHERE sys.index_columns.is_included_column = 0
AND sys.indexes.[object_id] =
sys.index_columns.[object_id]
AND sys.indexes.index_id = sys.index_columns.index_id
ORDER BY key_ordinal
FOR xml path('')) AS index_columns_key,
(SELECT sys.columns.[name] + ',' + ' '
FROM sys.index_columns
JOIN sys.columns
ON sys.index_columns.column_id = sys.columns.column_id
AND sys.index_columns.[object_id] =
sys.columns.[object_id]
WHERE sys.index_columns.is_included_column = 1
AND sys.indexes.[object_id] =
sys.index_columns.[object_id]
AND sys.indexes.index_id = sys.index_columns.index_id
ORDER BY index_column_id
FOR xml path('')) AS index_columns_include) AS Index_Columns) AS
Index_Columns
WHERE sys.schemas.[name] LIKE CASE
WHEN #SCHEMANAME = '' THEN
sys.schemas.[name]
ELSE #SCHEMANAME
END
AND sys.objects.[name] LIKE CASE
WHEN #TBLNAME = '' THEN
sys.objects.[name]
ELSE #TBLNAME
END
ORDER BY sys.schemas.[name],
sys.objects.[name],
sys.indexes.[name]
--#Results table has both PK,s Uniques and indexes in thme...pull them out for adding to funal results:
SET #CONSTRAINTSQLS = ''
SET #INDEXSQLS = ''
SELECT #CONSTRAINTSQLS = #CONSTRAINTSQLS + CASE WHEN is_primary_key = 1 OR
is_unique =
1 THEN #vbCrLf +
'CONSTRAINT [' + index_name + '] ' + Space
(
#STRINGLEN
- Len(index_name)) + CASE WHEN
is_primary_key =
1 THEN
' PRIMARY KEY ' ELSE CASE WHEN is_unique = 1
THEN
' UNIQUE ' ELSE '' END END + type_desc
+
CASE WHEN
type_desc='NONCLUSTERED' THEN '' ELSE ' '
END
+ ' ('
+ index_columns_key + ')' + CASE WHEN
index_columns_include <> '---' THEN
' INCLUDE ('
+
index_columns_include + ')' ELSE '' END +
CASE
WHEN
fill_factor <> 0 THEN ' WITH FILLFACTOR = '
+
CONVERT(
VARCHAR(30), fill_factor) ELSE '' END ELSE
''
END + ','
FROM #RESULTS
WHERE [type_desc] != 'HEAP'
AND is_primary_key = 1
OR is_unique = 1
ORDER BY is_primary_key DESC,
is_unique DESC
SELECT #INDEXSQLS = #INDEXSQLS + CASE WHEN is_primary_key = 0 OR is_unique =
0 THEN
#vbCrLf +
'CREATE INDEX [' + index_name + '] ' + Space(
#STRINGLEN
- Len(index_name)) + ' ON [' + [object_name] +
']' +
' (' +
index_columns_key + ')' + CASE WHEN
index_columns_include <>
'---' THEN ' INCLUDE (' + index_columns_include +
')'
ELSE
'' END + CASE WHEN fill_factor <> 0 THEN
' WITH FILLFACTOR = ' + CONVERT(VARCHAR(30),
fill_factor)
ELSE '' END END
FROM #RESULTS
WHERE [type_desc] != 'HEAP'
AND is_primary_key = 0
AND is_unique = 0
ORDER BY is_primary_key DESC,
is_unique DESC
IF #INDEXSQLS <> ''
SET #INDEXSQLS = #vbCrLf + 'GO' + #vbCrLf + #INDEXSQLS
SET #CHECKCONSTSQLS = ''
SELECT #CHECKCONSTSQLS = #CHECKCONSTSQLS + #vbCrLf
+ Isnull('CONSTRAINT [' + sys.objects.[name] +
'] ' +
Space(
#STRINGLEN - Len(sys.objects.[name])) +
' CHECK ' +
Isnull(sys.check_constraints.definition, '')
+
',', '')
FROM sys.objects
INNER JOIN sys.check_constraints
ON sys.objects.[object_id] =
sys.check_constraints.[object_id]
WHERE sys.objects.type = 'C'
AND sys.objects.parent_object_id = #TABLE_ID
SET #FKSQLS = '';
SELECT #FKSQLS = #FKSQLS + #vbCrLf + 'CONSTRAINT ['
+ Object_name(constid) + ']'
+ Space(#STRINGLEN - Len(Object_name(constid) ))
+ ' FOREIGN KEY (' + Col_name(fkeyid, fkey)
+ ') REFERENCES ' + Object_name(rkeyid) + '('
+ Col_name(rkeyid, rkey) + '),'
FROM sysforeignkeys
WHERE fkeyid = #TABLE_ID
SET #RULESCONSTSQLS = ''
SELECT #RULESCONSTSQLS = #RULESCONSTSQLS
+ Isnull( #vbCrLf +
'if not exists(SELECT [name] FROM sys.objects WHERE TYPE=''R'' AND schema_id = '
+ CONVERT(VARCHAR(30), sys.objects.schema_id) +
' AND [name] = ''[' +
Object_name(sys.columns.[rule_object_id]) + ']'')' +
#vbCrLf +
sys.sql_modules.definition + #vbCrLf + 'GO' + #vbCrLf +
'EXEC sp_binderule ['
+ sys.objects.[name] + '], ''[' +
Object_name(sys.columns.[object_id]) + '].[' +
sys.columns.[name] +
']''' + #vbCrLf + 'GO', '')
FROM sys.columns
INNER JOIN sys.objects
ON sys.objects.[object_id] = sys.columns.[object_id]
INNER JOIN sys.sql_modules
ON sys.columns.[rule_object_id] = sys.sql_modules.[object_id]
WHERE sys.columns.[rule_object_id] <> 0
AND sys.columns.[object_id] = #TABLE_ID
SET #TRIGGERSTATEMENT = ''
SELECT #TRIGGERSTATEMENT = #TRIGGERSTATEMENT + #vbCrLf
+ sys.sql_modules.[definition] + #vbCrLf + 'GO'
FROM sys.sql_modules
WHERE [object_id] IN(SELECT [object_id]
FROM sys.objects
WHERE type = 'TR'
AND [parent_object_id] = #TABLE_ID)
IF #TRIGGERSTATEMENT <> ''
SET #TRIGGERSTATEMENT = #vbCrLf + 'GO' + #vbCrLf + #TRIGGERSTATEMENT
SET #EXTENDEDPROPERTIES = ''
SELECT #EXTENDEDPROPERTIES = #EXTENDEDPROPERTIES + #vbCrLf
+ 'EXEC sys.sp_addextendedproperty #name = N''' + [name]
+ ''', #value = N'''
+ Replace(CONVERT(VARCHAR(max), [value]), '''',
'''''')
+
''', #level0type = N''SCHEMA'', #level0name = ['
+ #SCHEMANAME
+
'], #level1type = N''TABLE'', #level1name = ['
+ #TBLNAME + '];'
FROM Fn_listextendedproperty (NULL, 'schema', #SCHEMANAME, 'table',
#TBLNAME, NULL,
NULL);
IF #EXTENDEDPROPERTIES <> ''
SET #EXTENDEDPROPERTIES = #vbCrLf + 'GO' + #vbCrLf + #EXTENDEDPROPERTIES
SELECT #FINALSQL = #FINALSQL + #CONSTRAINTSQLS + #CHECKCONSTSQLS
+ #FKSQLS
SET #FINALSQL = Substring(#FINALSQL, 1, Len(#FINALSQL) - 1);
SET #FINALSQL = #FINALSQL + ')' + #vbCrLf;
SELECT #FINALSQL + #INDEXSQLS + #RULESCONSTSQLS
+ #TRIGGERSTATEMENT + #EXTENDEDPROPERTIES
END
go
You can use mssql-scripter direct from Microsoft, it is quite new and requires a recent Python runtime... but works on Linux, Macos and Windows
Actually, there is still no way from Microsoft supported today to support this.
But you could do a hack:
With the following PowerShell Script you can call the DDL export via PowerShell:
$server = "MSSQLServer\Instance"
$srcDB = "TestDB"
$dump = "C:\Temp\EE\TestDB.sql"
# Stop on any error
$ErrorActionPreference = "stop"
[void] [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SqlServer.SMO')
[void] [System.Reflection.Assembly]::LoadWithPartialName('Microsoft.SQlServer.SMOExtended')
$xfer = [Microsoft.SqlServer.Management.SMO.Transfer] ([Microsoft.SqlServer.Management.SMO.Server] $server).Databases[$srcDB]
# Set export options.
$opts = New-Object Microsoft.SqlServer.Management.SMO.ScriptingOptions
$opts.Filename = $dump
$opts.ToFileOnly = $true
$opts.AllowSystemObjects = $false
$opts.Statistics = $false
$opts.ScriptDataCompression = $false
$xfer.options = $opts
$xfer.ScriptTransfer()
Now just save this script and all it via TSQL - take a look here: call PowerShell via T-SQL
... and then read the temp file with OPENROWSET(BULK ..., SINGLE_CLOB)

Why does this sql function not work with REPLACE?

I am having a problem with my sql function. The following function operates as expect but when I substitute, it only returns one row:
CAST(t.ColumnName as nvarchar(100))
for:
REPLACE(CAST(t.ColumnName as nvarchar(100)), 'ID', 'Id')
What is wrong? Here is my calling code:
PRINT dbo.CreatePocoFromTable('dbo.OnePoundFish')
Here is the function itself:
CREATE FUNCTION [dbo].[CreatePocoFromTable]
(#SchemaAndName nvarchar(200))
RETURNS Nvarchar(MAX) AS
BEGIN
/* Example call:
PRINT dbo.CreatePocoFromTable('dbo.OnePoundFish')
*/
DECLARE #TableName NVARCHAR(100) = SUBSTRING(#SchemaAndName , CHARINDEX('.', #SchemaAndName ) + 1, LEN(#SchemaAndName ))
DECLARE #TableSchema NVARCHAR(100) = SUBSTRING(#SchemaAndName , 1, CHARINDEX('.', #SchemaAndName ) - 1)
DECLARE #result Nvarchar(max) = ''
SET #result = #result + 'using System;' + CHAR(13) + CHAR(13)
IF (#TableSchema IS NOT NULL)
BEGIN
SET #result = #result + 'namespace ' + #TableSchema + CHAR(13) + '{' + CHAR(13)
END
SET #result = #result + 'public class ' + #TableName + CHAR(13) + '{' + CHAR(13)
SET #result = #result + '#region Instance Properties' + CHAR(13)
SELECT #result = #result + CHAR(13)
-- BL/DAL/DataRepository Entity attributes
+ '[DataField("' + t.ColumnName + '")]' + CHAR(13)
+ ' public ' + t.ColumnType + ' ' + CAST(t.ColumnName as nvarchar(100)) + ' { get; set; } ' + CHAR(13)
FROM
(
SELECT
c.COLUMN_NAME AS ColumnName
, CASE c.DATA_TYPE
WHEN 'bigint' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Int64?' ELSE 'Int64' END
WHEN 'binary' THEN 'Byte[]'
WHEN 'bit' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Boolean?' ELSE 'Boolean' END
WHEN 'char' THEN 'String'
WHEN 'date' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END
WHEN 'datetime' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END
WHEN 'datetime2' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END
WHEN 'datetimeoffset' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'DateTimeOffset?' ELSE 'DateTimeOffset' END
WHEN 'decimal' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END
WHEN 'float' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Single?' ELSE 'Single' END
WHEN 'image' THEN 'Byte[]'
WHEN 'int' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Int32?' ELSE 'Int32' END
WHEN 'money' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END
WHEN 'nchar' THEN 'String'
WHEN 'ntext' THEN 'String'
WHEN 'numeric' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END
WHEN 'nvarchar' THEN 'String'
WHEN 'real' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Double?' ELSE 'Double' END
WHEN 'smalldatetime' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END
WHEN 'smallint' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Int16?' ELSE 'Int16'END
WHEN 'smallmoney' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Decimal?' ELSE 'Decimal' END
WHEN 'text' THEN 'String'
WHEN 'time' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'TimeSpan?' ELSE 'TimeSpan' END
WHEN 'timestamp' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'DateTime?' ELSE 'DateTime' END
WHEN 'tinyint' THEN
CASE C.IS_NULLABLE
WHEN 'YES' THEN 'Byte?' ELSE 'Byte' END
WHEN 'uniqueidentifier' THEN 'Guid'
WHEN 'varbinary' THEN 'Byte[]'
WHEN 'varchar' THEN 'String'
ELSE 'Object'
END AS ColumnType
, c.ORDINAL_POSITION
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE c.TABLE_NAME = #TableName and ISNULL(#TableSchema, c.TABLE_SCHEMA) = c.TABLE_SCHEMA
) t
ORDER BY t.ORDINAL_POSITION
SET #result = #result + CHAR(13) + '#endregion Instance Properties' + CHAR(13)
SET #result = #result + '}' + CHAR(13)
IF (#TableSchema IS NOT NULL)
BEGIN
SET #result = #result + CHAR(13) + '}'
END
RETURN #Result
END
Thanks :)
only the interesting part ...
SELECT #result = #result + CHAR(13)
-- BL/DAL/DataRepository Entity attributes
+ '[DataField("' + CAST(REPLACE(t.ColumnName , 'ID', 'Id') as nvarchar(100)) + '")]' + CHAR(13)
-- + '[DataField("' + t.ColumnName + '")]' + CHAR(13)
+ ' public ' + t.ColumnType + ' ' + CAST(t.ColumnName as nvarchar(100)) + ' { get; set; } ' + CHAR(13)
FROM
Is your sql server set to be case sensitive? If not (and I believe it's not by default) then replace based on different case of the same word will not work.
See this link to change the collation to a case sensitive one How do I change SQL Server 2005 to be case sensitive?

Writing a dreaded SQL search query

I am working on a search query that does not seem to work.
The complete query is:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER PROCEDURE [dbo].[usp_Item_Search]
#Item_Num varchar(30) = NULL
,#Search_Type int = NULL
,#Vendor_Num varchar(10) = NULL
,#Search_User_ID int = NULL
,#StartDate smalldatetime = NULL
,#EndDate smalldatetime = NULL
AS
DECLARE #SQLstr as nvarchar(4000)
Set #SQLstr = 'SELECT RecID, Vendor_Num, Vendor_Name, InvoiceNum, Item_Num,
(SELECT CONVERT(VARCHAR(11), RecDate, 106) AS [DD MON YYYY]) As RecDate, NeedsUpdate, RecAddUserID FROM [tbl_ItemLog] '
IF (#Item_Num IS NOT NULL)
Begin
If #Search_Type = 0
BEGIN
Set #SQLstr = #SQLstr + 'WHERE Item_Num LIKE ''' + #Item_Num + '%'''
END
If #Search_Type = 1
BEGIN
Set #SQLstr = #SQLstr + 'WHERE Item_Num LIKE ''%' + #Item_Num + '%'''
END
If #Search_Type = 2
BEGIN
Set #SQLstr = #SQLstr + 'WHERE Item_Num LIKE ''%' + #Item_Num + ''''
END
End
IF (#Vendor_Num IS NOT NULL)
Begin
Set #SQLstr = #SQLstr + ' AND Vendor_Num = ''' + #Vendor_Num + ''''
End
IF (Search_User_ID IS NOT NULL)
Begin
Set #SQLstr = #SQLstr + ' AND RecAddUserID = ' + convert(nvarchar(20),#Search_User_ID)
End
Set #SQLstr = #SQLstr + ' AND (RecDate BETWEEN ''' + convert(nvarchar(10),#StartDate,101) + ''' AND ''' + convert(nvarchar(10),#EndDate,101) + ''')'
PRINT (#SQLstr)
--Execute (#SQLstr)
When I pass paramters to the query, and if the Vendor_Num value is blank, the output from PRINT(#SQLstr) is
SELECT RecID, Vendor_Num, Vendor_Name, InvoiceNum, Item_Num,
(SELECT CONVERT(VARCHAR(11), RecDate, 106) AS [DD MON YYYY]) As RecDate,
NeedsUpdate, RecAddUserID FROM [tbl_ItemLog] WHERE Item_Num LIKE '2200%'
**AND Vendor_Num = ''** AND RecAddUserID = 2 AND (RecDate BETWEEN '01/01/2001'
AND '12/12/2002')
What I want the output to be is:
SELECT RecID, Vendor_Num, Vendor_Name, InvoiceNum, Item_Num,
(SELECT CONVERT(VARCHAR(11), RecDate, 106) AS [DD MON YYYY]) As RecDate,
NeedsUpdate, RecAddUserID FROM [tbl_ItemLog] WHERE Item_Num LIKE '2200%'
AND RecAddUserID = 2 AND (RecDate BETWEEN '01/01/2001' AND '12/12/2002')
How can I structure the query so if the param value is blank, it does not show the field.
Try changing
IF (#Vendor_Num IS NOT NULL)
to
IF (#Vendor_Num IS NOT NULL and LTRIM(#Vendor_Num) <> '')