How to define a complex return type without a table? - sql

I have a stored procedure with dynamic sql that I need to return an OBJECT_RESULT type. I am trying to build the complex type within visual studio through EF. The problem, I believe, is coming from the fact that the table is one of the parameters of the proc. So when EF tries to build the type and the table is null, I get the error that the selected stored proc returns no columns. I have tried setting FMTONLY off and specified the actual columns in the select statement. Any way I can achieve this? The proc:
SET FMTONLY OFF
GO
ALTER PROCEDURE [dbo].[GetFormFieldCDC2]
(
#formfieldId INT,
#C___operation INT,
#C___start_lsn binary(10),
#schemaname sysname,
#tablename sysname
)
AS
SET NOCOUNT ON;
--IF (OBJECT_ID(QUOTENAME(#schemaname) + '.' + QUOTENAME(#tablename)) IS NULL)
-- THROW 50000, 'Table not found', 0;
DECLARE #sql AS NVARCHAR(MAX) = '
SELECT [__$start_lsn]
,[__$end_lsn]
,[__$seqval]
,[__$operation]
,[__$update_mask]
,[ID]
,[LookupList]
,[LookupColumns]
,[LookupAdditionalColumns]
,[FormFieldsID]
,[DateAdded]
,[DateEdited]
,[CreatedBy]
,[EditedBy]
,[__$command_id]
FROM ' + QUOTENAME(#schemaname) + '.' + QUOTENAME(#tablename) + '
WHERE __$start_lsn = #C___start_lsn
AND __$operation = #C___operation
AND FormFieldsID = #formfieldId;
';
EXEC sp_executesql #SQL,
N' #formfieldId INT,
#C___operation INT,
#C___start_lsn binary(10)',
#formfieldId = #formfieldId,
#C___operation = #C___operation,
#C___start_lsn = #C___start_lsn;

Don't set FMTONLY off. That's an old hack that is no longer necessary. Instead, explicitly declare the shape of the resultset, using EXECUTE ... WITH RESULT SETS when you execute the dynamic SQL. Like this:
CREATE OR ALTER PROCEDURE [dbo].[GetFormFieldCDC2]
(
#formfieldId INT,
#C___operation INT,
#C___start_lsn binary(10),
#schemaname sysname,
#tablename sysname
)
AS
BEGIN
/*
declare #object_id int = object_id('GetFormFieldCDC2')
select * from sys.dm_exec_describe_first_result_set_for_object(#object_id,0)
*/
SET NOCOUNT ON;
--IF (OBJECT_ID(QUOTENAME(#schemaname) + '.' + QUOTENAME(#tablename)) IS NULL)
-- THROW 50000, 'Table not found', 0;
DECLARE #sql AS NVARCHAR(MAX) = '
SELECT [__$start_lsn]
,[__$end_lsn]
,[__$seqval]
,[__$operation]
,[__$update_mask]
,[ID]
,[LookupList]
,[LookupColumns]
,[LookupAdditionalColumns]
,[FormFieldsID]
,[DateAdded]
,[DateEdited]
,[CreatedBy]
,[EditedBy]
,[__$command_id]
FROM ' + QUOTENAME(#schemaname) + '.' + QUOTENAME(#tablename) + '
WHERE __$start_lsn = #C___start_lsn
AND __$operation = #C___operation
AND FormFieldsID = #formfieldId;
';
EXEC sp_executesql #SQL,
N' #formfieldId INT,
#C___operation INT,
#C___start_lsn binary(10)',
#formfieldId = #formfieldId,
#C___operation = #C___operation,
#C___start_lsn = #C___start_lsn
WITH RESULT SETS
(
(
[__$start_lsn] binary(10)
,[__$end_lsn] binary(10)
,[__$seqval] binary(10)
,[__$operation] int
,[__$update_mask] varbinary(128)
,[ID] int
,[LookupList] varchar(max)
,[LookupColumns] varchar(max)
,[LookupAdditionalColumns] varchar(max)
,[FormFieldsID] int
,[DateAdded] datetime
,[DateEdited] datetime
,[CreatedBy] varchar(200)
,[EditedBy] varchar(200)
,[__$command_id] int
)
);
END
Then
declare #object_id int = object_id('GetFormFieldCDC2')
select * from sys.dm_exec_describe_first_result_set_for_object(#object_id,0)
Will return the resultset metadata.

Related

Run a dynamic SQL query from a stored procedure to populate a GridView

I have a dynamic query that adds WHERE clauses according to the parameters received:
DECLARE #p1 varchar(max);
DECLARE #p2 varchar(max);
DECLARE #p3 varchar(max);
DECLARE #p4 varchar(max);
DECLARE #p5 varchar(max);
DECLARE #p6 varchar(max);
DECLARE #p7 varchar(max);
DECLARE #p8 varchar(max);
DECLARE #p9 varchar(max);
DECLARE #p10 varchar(max);
DECLARE #p11 varchar(max);
DECLARE #p12 varchar(max);
SET #p9 = 'Acta'
DECLARE #SQL varchar(max);
SET #SQL =
'SELECT
COUNT(*) AS [regs]
FROM [dbo].[DP_Fichas] [F]
WHERE 1 = 1';
IF(#p1 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[ID] = ''' + #p1 + ''''
END;
IF(#p2 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Titulo] LIKE ''%' + #p2 + '%'''
END;
IF(#p3 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Texto] = ''' + #p3 + ''''
END;
IF(#p4 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Fecha] = ''' + #p4 + ' 00:00:00.0000000'''
END;
IF(#p5 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Constitucionailidad] = ''' + #p5 + ''''
END;
IF(#p6 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Comentarios] = ''' + #p6 + ''''
END;
IF(#p7 IS NOT NULL)
BEGIN
DECLARE #idfuente varchar(max)
SET #idfuente =
(
SELECT
[X1].[ID]
FROM [dbo].[DP_Fuentes] [X1]
WHERE
([X1].[Nombre] = #p7)
)
SET #SQL = #SQL + '
AND [F].[IdFuente] = ''' + #idfuente + ''''
END;
IF(#p8 IS NOT NULL)
BEGIN
DECLARE #idvigencia varchar(max)
SET #idvigencia =
(
SELECT
[X1].[ID]
FROM [dbo].[DP_Vigencia] [X1]
WHERE
([X1].[Nombre] = #p8)
)
SET #SQL = #SQL + '
AND [F].[IdVigencia] = ''' + #idvigencia + ''''
END;
IF(#p9 IS NOT NULL)
BEGIN
DECLARE #idtipo varchar(max)
SET #idtipo =
(
SELECT
[X1].[ID]
FROM [dbo].[DP_TipoFicha] [X1]
WHERE
([X1].[Nombre] = #p9)
)
SET #SQL = #SQL + '
AND [F].[IdIdentificacion] = ''' + #idtipo + ''''
END;
IF(#p10 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[NormaNumero] = ''' + #p10 + ''''
END;
IF(#p11 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Publicacion] = ''' + #p11 + ''''
END;
IF(#p12 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[TemaResumen] = ''' + #p12 + ''''
END;
EXEC(#SQL);
In this example, only the #p9 parameter has a value, so the returned SQL command will be:
SELECT COUNT(*) AS [regs]
FROM [dbo].[DP_Fichas] [F]
WHERE 1 = 1
AND [F].[IdIdentificacion] = '2'
This is working just fine when I execute the query, but when I save it to a stored procedure, it comes back empty.
This is the code for the stored procedure:
CREATE PROCEDURE [dbo].[SEL_DP_Fichas_Buscar_Algoritmo_Contar]
(
#p1 varchar(max),
#p2 varchar(max),
#p3 varchar(max),
#p4 varchar(max),
#p5 varchar(max),
#p6 varchar(max),
#p7 varchar(max),
#p8 varchar(max),
#p9 varchar(max),
#p10 varchar(max),
#p11 varchar(max),
#p12 varchar(max)
)
AS
BEGIN
DECLARE #p1f varchar(max) = #p1;
DECLARE #p2f varchar(max) = #p2;
DECLARE #p3f varchar(max) = #p3;
DECLARE #p4f varchar(max) = #p4;
DECLARE #p5f varchar(max) = #p5;
DECLARE #p6f varchar(max) = #p6;
DECLARE #p7f varchar(max) = #p7;
DECLARE #p8f varchar(max) = #p8;
DECLARE #p9f varchar(max) = #p9;
DECLARE #p10f varchar(max) = #p10;
DECLARE #p11f varchar(max) = #p11;
DECLARE #p12f varchar(max) = #p12;
DECLARE #SQL varchar(max);
SET #SQL =
'SELECT
COUNT(*)
FROM [dbo].[DP_Fichas] [F]
WHERE 1 = 1'
IF(#p1 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[ID] = ''' + #p1 + ''''
END;
IF(#p2 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Titulo] LIKE ''%' + #p2 + '%'''
END;
IF(#p3 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Texto] = ''' + #p3 + ''''
END;
IF(#p4 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Fecha] = ''' + #p4 + ' 00:00:00.0000000'''
END;
IF(#p5 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Constitucionailidad] = ''' + #p5 + ''''
END;
IF(#p6 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Comentarios] = ''' + #p6 + ''''
END;
IF(#p7 IS NOT NULL)
BEGIN
DECLARE #idfuente varchar(max)
SET #idfuente =
(
SELECT
[X1].[ID]
FROM [dbo].[DP_Fuentes] [X1]
WHERE
([X1].[Nombre] = #p7)
)
SET #SQL = #SQL + '
AND [F].[IdFuente] = ''' + #idfuente + ''''
END;
IF(#p8 IS NOT NULL)
BEGIN
DECLARE #idvigencia varchar(max)
SET #idvigencia =
(
SELECT
[X1].[ID]
FROM [dbo].[DP_Vigencia] [X1]
WHERE
([X1].[Nombre] = #p8)
)
SET #SQL = #SQL + '
AND [F].[IdVigencia] = ''' + #idvigencia + ''''
END;
IF(#p9 IS NOT NULL)
BEGIN
DECLARE #idtipo varchar(max)
SET #idtipo =
(
SELECT
[X1].[ID]
FROM [dbo].[DP_TipoFicha] [X1]
WHERE
([X1].[Nombre] = #p9)
)
SET #SQL = #SQL + '
AND [F].[IdIdentificacion] = ''' + #idtipo + ''''
END;
IF(#p10 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[NormaNumero] = ''' + #p10 + ''''
END;
IF(#p11 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[Publicacion] = ''' + #p11 + ''''
END;
IF(#p12 IS NOT NULL)
BEGIN
SET #SQL = #SQL + '
AND [F].[TemaResumen] = ''' + #p12 + ''''
END;
EXECUTE (#SQL);
END
GO
Whenever I run the stored procedure:
EXEC [dbo].[SEL_DP_Fichas_Buscar_Algoritmo_Contar]
#p1 = '',
#p2 = '',
#p3 = '',
#p4 = '',
#p5 = '',
#p6 = '',
#p7 = '',
#p8 = '',
#p9 = 'Actas',
#p10 = '',
#p11 = '',
#p12 = '';
I should get 142 as a count result, but I'm getting:
Commands completed successfully.
Completion time: 2021-06-15T16:36:31.1131407-05:00
I need this stored procedure to fill up a GridView:
string spQuerySel0 = "SEL_DP_Fichas_Buscar_Algoritmo";
DataSet dsFlt1;
SqlConnection conFlt1;
SqlDataAdapter daFlt1;
conFlt1 = new SqlConnection(enchufe);
daFlt1 = new SqlDataAdapter(spQuerySel0, conFlt1);
daFlt1.SelectCommand.CommandType = CommandType.StoredProcedure;
daFlt1.SelectCommand.Parameters.AddWithValue("#p1", p1);
daFlt1.SelectCommand.Parameters.AddWithValue("#p2", p2);
daFlt1.SelectCommand.Parameters.AddWithValue("#p3", p3);
daFlt1.SelectCommand.Parameters.AddWithValue("#p4", p4);
daFlt1.SelectCommand.Parameters.AddWithValue("#p5", p5);
daFlt1.SelectCommand.Parameters.AddWithValue("#p6", p6);
daFlt1.SelectCommand.Parameters.AddWithValue("#p7", p7);
daFlt1.SelectCommand.Parameters.AddWithValue("#p8", p8);
daFlt1.SelectCommand.Parameters.AddWithValue("#p9", p9);
daFlt1.SelectCommand.Parameters.AddWithValue("#p10", p10);
daFlt1.SelectCommand.Parameters.AddWithValue("#p11", p11);
daFlt1.SelectCommand.Parameters.AddWithValue("#p12", p12);
dsFlt1 = new DataSet();
daFlt1.Fill(dsFlt1, spQuerySel0);
gvFichasRes.DataSource = dsFlt1.Tables[spQuerySel0].DefaultView;
gvFichasRes.DataBind();
daFlt1.Dispose();
conFlt1.Close();
But I'm getting a null exception, I guess that is because the stored procedure is returning nothing.
I've also tried to add OUTPUT to the query, but It'll break to a "Not found procedure" error.
What can I do here?
This type of query is known as a Kitchen-Sink query.
You have a number of issues with your current code:
#SQL should be declared as nvarchar(max)
You should parameterize the dynamic statement, in other words: the parameters should be pushed through via sp_executesql
The same applies to the subqueries, they can be run in the dynamic part
The parameter types should match the columns they are compared against, which in turn should be fitting for the data in them. I've made a guess at suitable types.
It's unclear what you hoped to achieve with the extra DECLARE #p1f statements, perhaps to avoid parameter sniffing, but that can be avoided with OPTION(OPTIMIZE FOR UNKNOWN), and in any case doing this dynamically means you probably should use parameter sniffing
In the C# side, you should dispose all SQL objects with using blocks
You should also avoid AddWithValue, specify the parameter types explicitly.
So your final procedure would look something like this:
CREATE PROCEDURE [dbo].[SEL_DP_Fichas_Buscar_Algoritmo_Contar]
(
#p1 int,
#p2 varchar(200),
#p3 varchar(200),
#p4 date,
#p5 char(2),
#p6 varchar(200),
#p7 int,
#p8 int,
#p9 int,
#p10 varchar(200),
#p11 varchar(200),
#p12 varchar(200)
)
AS
DECLARE #SQL nvarchar(max) =
N'
SELECT
COUNT(*)
FROM [dbo].[DP_Fichas] [F]
WHERE 1 = 1'
;
IF(#p1 IS NOT NULL)
SET #SQL += N'
AND [F].[ID] = #p1';
IF(#p2 IS NOT NULL)
SET #SQL += N'
AND [F].[Titulo] LIKE ''%'' + #p2 + ''%''';
IF(#p3 IS NOT NULL)
SET #SQL += N'
AND [F].[Texto] = #p3';
IF(#p4 IS NOT NULL)
SET #SQL += N '
AND [F].[Fecha] = #p4';
IF(#p5 IS NOT NULL)
SET #SQL += N'
AND [F].[Constitucionailidad] = #p5';
IF(#p6 IS NOT NULL)
SET #SQL += N'
AND [F].[Comentarios] = #p6';
IF(#p7 IS NOT NULL)
SET #SQL = #SQL + '
AND [F].[IdFuente] IN
(
SELECT
[X1].[ID]
FROM [dbo].[DP_Fuentes] [X1]
WHERE
([X1].[Nombre] = #p7)
)';
IF(#p8 IS NOT NULL)
SET #SQL = #SQL + '
AND [F].[IdVigencia] IN
(
SELECT
[X1].[ID]
FROM [dbo].[DP_Vigencia] [X1]
WHERE
([X1].[Nombre] = #p8)
)';
IF(#p9 IS NOT NULL)
SET #SQL = #SQL + '
AND [F].[IdIdentificacion] IN
(
SELECT
[X1].[ID]
FROM [dbo].[DP_TipoFicha] [X1]
WHERE
([X1].[Nombre] = #p9)
)';
IF(#p10 IS NOT NULL)
SET #SQL += N'
AND [F].[NormaNumero] = #p10';
IF(#p11 IS NOT NULL)
SET #SQL = #SQL + '
AND [F].[Publicacion] = #p11';
IF(#p12 IS NOT NULL)
SET #SQL += N'
AND [F].[TemaResumen] = #p12';
EXEC sp_executesql
#SQL,
N'#p1 int,
#p2 varchar(200),
#p3 varchar(200),
#p4 date,
#p5 char(2),
#p6 varchar(200),
#p7 int,
#p8 int,
#p9 int,
#p10 varchar(200),
#p11 varchar(200),
#p12 varchar(200)',
#p1 = #p1,
#p2 = #p2,
#p3 = #p3,
#p4 = #p4,
#p5 = #p5,
#p6 = #p6,
#p7 = #p7,
#p8 = #p8,
#p9 = #p9,
#p10 = #p10,
#p11 = #p11,
#p12 = #p12;
;
GO
I found the answer with the following lines of code:
DECLARE #statement NVARCHAR(4000);
SET #statement = #SQL;
EXECUTE sp_executesql #statement;
I added this to the end of the SP, solved the code issues suggested by SMor and everything worked.

Won't able to Pass the Table name Dynamically using sp_execute_external_script using R Script

I create this query, This will work fine On SQL Server
When am using this query in inside sp_execute_external_script using R Script
I won't able to pass '+#TableName+' please check and Suggest some Solution
// This code Work fine in SQL
Declare #TableName nvarchar(max)
Declare #Plant nvarchar(max) ='XXX'
Declare #Tub nvarchar(max) ='YYY'
Set #TableNameByModelName = 'Ref_curve' -- Need This from UI
exec (N'SELECT
p.[Plant]
,P.[Tub]
,r.[Power]
FROM [dbo].[Analysis_Curve] as P
INNER join [P_Analysis].dbo.'+#TableName+' AS r on r.Speed = P.Speed
where P.Plant= '''+#Plant+'''
AND P.Tub = '''+#Tub+'''')
// This code is Using R script Need Suggestion here
Alter procedure [dbo].[Pass_Dynamic_TableName]
( #Plant1 nvarchar(50),
#Tub1 nvarchar(50)
)
As
Begin
Declare #TableName NVARCHAR(200);
Set #TableName = 'Ref_curve'
EXEC sp_execute_external_script
#language =N'R',
#script=N'df <- as.data.frame(InputDataSet);
OutputDataSet <-df'
,#input_data_1 =N'SELECT
p.[Plant]
,P.[Tub]
,r.[Power]
FROM [dbo].[Analysis_Curve] as P
INNER join [P_Analysis].dbo.#TableName AS r on r.Speed = P.Speed
where P.Plant= #Plant22
AND P.Tub = #Tub22'
,#params = N'#Plant22 varchar(50) OUTPUT, #Tub22 varchar(50) OUTPUT'
,#Plant22 = #Plant1
,#Tub22 =#Tub1
WITH RESULT SETS Undefined;
END
Could you try this.
Alter procedure [dbo].[Pass_Dynamic_TableName]
( #Plant1 nvarchar(50),
#Tub1 nvarchar(50)
)
As
Begin
Declare #TableName NVARCHAR(200);
Set #TableName = 'Ref_curve'
DECLARE #input_script NVARCHAR(MAX) =N'SELECT
p.[Plant]
,P.[Tub]
,r.[Power]
FROM [dbo].[Analysis_Curve] as P
INNER join [P_Analysis].dbo.' + QUOTENAME(#TableName) + ' AS r on r.Speed = P.Speed
where P.Plant= #Plant22
AND P.Tub = #Tub22'
EXEC sp_execute_external_script
#language =N'R',
#script=N'df <- as.data.frame(InputDataSet);
OutputDataSet <-df'
,#input_data_1 = #input_script
,#params = N'#Plant22 varchar(50), #Tub22 varchar(50) '
,#Plant22 = #Plant1
,#Tub22 =#Tub1
WITH RESULT SETS Undefined;
END

Incorrect syntax near '=' while trying to call a stored procedure in T-sql

I am calling a stored procedure called Searchprocedure. I get an error at line where I am calling it. I have not made any changes to the parameters passed in the procedure and it was called just fine with same calling statement earlier.
Exec SearchProcedure #firstname = 'Simran', #middlename = 'kaur', #lastname = 'Khurana', #City = 'Delhi'
What's wrong with the syntax that is gives the error that says:
Incorrect syntax near '='
Edit:
Statement where I did :
set #sql = 'declare ' + '#Temp'+ #colVar + ' int'
exec(#sql)
select #sql as 'SQLFORDECLARATIONS
outputs
declare #TempMiddleName int
yet when I try to set value in the variable gives error that it should be declared first.
The set statement results in :
select #TempMiddleName=dbo.[MatchMiddleName](MiddleNameFromUser,MiddleNameFromTable,0)
which is what is should be yet it not able to see the declared variable
The stored procedure is as follows:
create procedure SearchProcedure
(
#firstname nvarchar(20),
#middlename nvarchar(20) = null,
#lastname nvarchar(20),
#DOB Date = null,
#SSN nvarchar(30)= null,
#ZIP nvarchar(10)= null,
#StateOfResidence nvarchar(2)= null,
#City nvarchar(20)= null,
#StreetName nvarchar(20)= null,
#StreetType nvarchar(20)= null,
#BuildingNumber int= null,
#Aptnumber nvarchar(10)= null
)
As
DECLARE #sSQL NVARCHAR(2000), #Where NVARCHAR(1000) = ' '
declare #Percent int,
#FN nvarchar(20),
#MN nvarchar(20) = null,
#LN nvarchar(20),
#DateOfB Date = null,
#SSNumber nvarchar(30)= null,
#ZIPCode nvarchar(10)= null,
#StateOfRes nvarchar(2)= null,
#CityOfRes nvarchar(20)= null,
#StreetNameRes nvarchar(20)= null,
#StreetTypeRes nvarchar(20)= null,
#BuildingNumberRes int= null,
#AptnumberRes nvarchar(10)= null
set #Percent = 0
create table #results
(
firstname nvarchar(20) not null,
middlename nvarchar(20),
lastname nvarchar(20)not null,
PercentageMatch int not null,
DOB Date,
SSN nvarchar(30),
ZIP nvarchar(10),
[State] nvarchar(2),
City nvarchar(20),
StreetName nvarchar(20),
StreetType nvarchar(20),
BuildingNumber int,
Aptnumber nvarchar(10)
)
declare c Cursor local static Read_only
for
SELECT * from dbo.Patients where firstname = #firstname
open c
fetch next from c into #FN,
#MN,
#LN,
#DateOfB,
#SSNumber,
#ZIPCode,
#StateOfRes,
#CityOfRes,
#StreetNameRes,
#StreetTypeRes,
#BuildingNumberRes,
#AptnumberRes
while ##FETCH_STATUS = 0 BEGIN
/*set #Percent = dbo.[MatchLastName](#lastname, #LN, #Percent)
set #Percent = dbo.[MatchMiddleName](#middlename, #MN, #Percent)
set #Percent = dbo.[MatchCity](#City, #CityOfRes, #Percent)*/
Exec [dbo].[OutputProcedure] #lastname, #LN, #middlename, #MN,#City, #CityOfRes, #Percent output
Insert into #results values
(#FN,#MN,#LN,#Percent, #DateOfB,#SSNumber, #ZIPCode,#StateOfRes,#CityOfRes,#StreetNameRes,#StreetTypeRes,#BuildingNumberRes,#AptnumberRes)
fetch next from c into #FN,
#MN,
#LN,
#DateOfB,
#SSNumber,
#ZIPCode,
#StateOfRes,
#CityOfRes,
#StreetNameRes,
#StreetTypeRes,
#BuildingNumberRes,
#AptnumberRes
end
select * from #results order by PercentageMatch desc
IF OBJECT_ID('tempdb..#results') IS NOT NULL DROP TABLE #results
go
OutputProcedure code is as follows:
CREATE Procedure OutputProcedure
(
#LastNameFromUser nvarchar(20) = null,
#LastNameFromTable nvarchar(20),
#MiddleNameFromUser nvarchar(20) = null,
#MiddleNameFromTable nvarchar(20) = null,
#CityFromUser nvarchar(20) = null,
#CityFromTable nvarchar(20) = null,
#Percentage int out
)
AS
BEGIN
select 'OUTPUTPROCEDURECALLED'
declare #maxvalue int
DECLARE #variableTable TABLE (
idx int identity(1,1),
matchvalue nvarchar(15))
INSERT INTO #variableTable(matchvalue) values ('MiddleName')
INSERT INTO #variableTable(matchvalue) values ('LastName')
INSERT INTO #variableTable(matchvalue) values ('City')
SELECT * FROM #variableTable
DECLARE #counter int
declare #sql nvarchar(100)
declare #sql2 nvarchar(25), #finalResult nvarchar(100)
declare #sql3 nvarchar(300), #sql4 nvarchar(15), #tempresultStore nvarchar(20), #temp int, #temp2 int, #average int
SET #counter = 1
SELECT #maxvalue = (SELECT MAX(idx) FROM #variableTable)
select #maxvalue as 'MAXVALUE'
WHILE(#counter <= #maxvalue)
BEGIN
DECLARE #colVar nvarchar(15)
SELECT #colVar = matchvalue FROM #variableTable WHERE idx = #counter
set #sql = 'declare ' + '#Temp'+ #colVar + ' int'
exec(#sql)
select #sql as 'SQLFORDECLARATIONS'
/*set #temp = CHARINDEX(' ',#sql)
select #temp as 'resultofcharindex'
set #temp2 = LEN(#sql) - (#temp)
SELECT #temp2 AS 'AFTERADDING1'
set #tempresultStore = right(#sql, #temp2)*/
set #tempresultStore = 'Temp'+#colVar
SELECT #tempresultStore AS 'FINALCUTPART'
set #sql3 = 'set ' + ' ' + #tempresultStore + '=' + 'dbo.[Match' + #colVar + '](' + #colVar + 'FromUser' + ',' + #colVar + 'FromTable' + ',' + '0)'
EXEC(#sql3)
select #sql3 as 'check sql query formed'
set #finalResult = #finalResult + #tempresultStore
select #finalResult as 'SUM'
SET #counter = #counter + 1
select #counter as 'COUNTERVALUE'
END
set #Percentage = #finalResult/#maxvalue
SELECT #Percentage AS 'FINALRESULT'
RETURN
END
--Setting variable in Dynamic SQL
DECLARE
#sql NVARCHAR(MAX),
#Name NVARCHAR(100)
SET #Name = '#B2E0EB1A'
SET #sql =
'
DECLARE #MyVar NVARCHAR(100)
SELECT TOP 1 #MyVar = name FROM sys.objects WHERE name LIKE ''%a''--Escaping single quote with double quote
PRINT #MyVar
'
EXEC(#sql)
SET #sql =
'
DECLARE #MyVar NVARCHAR(100)
SET #MyVar = '''+(SELECT TOP 1 name FROM sys.objects WHERE name LIKE '%a')+'''--Escaping single quote with double quote
PRINT #MyVar
'
EXEC(#sql)
SET #sql =
'
DECLARE #MyVar NVARCHAR(100)
SET #MyVar = '''+#Name+'''--Escaping single quote with double quote
PRINT #MyVar
'
EXEC(#sql)
SET #sql =
'
DECLARE #MyVar NVARCHAR(100)
SET #MyVar = ''#B2E0EB1A''--Escaping single quote with double quote
PRINT #MyVar
'
EXEC(#sql)
If you want to get output variable from your dynamic query you have to use sp_executesql procedure instead of EXEC()
Study this code
DECLARE #DynamicSQLOutput NVARCHAR(100)
DECLARE #SQL nvarchar(500);
DECLARE #ParmeterDefinition nvarchar(500);
--in this variabe you write the variables which you want to be declared in the dynamic sql without using the declare
SET #ParmeterDefinition = N'#FinalOutputResultInDynamicSQL NVARCHAR(100) OUTPUT';
--here you write your dynamic code
SELECT #SQL = N'SET #FinalOutputResultInDynamicSQL = ''test'' '
EXEC sp_executesql
#SQL, --Execute code
#ParmeterDefinition, -- Define Parameters
#FinalOutputResultInDynamicSQL = #DynamicSQLOutput OUTPUT --Get output
--Note that #FinalOutputResultInDynamicSQL is only defined in #ParmeterDefinition but not outside of the dynamic sql
PRINT #DynamicSQLOutput;
I think too many things wrong in your Dynamic sql. I found one
SET #sql3 = 'set ' + ' ' + #tempresultStore + ' = ' + 'dbo.[Match'
+ #colVar + '](' + #colVar + 'FromUser' + ',' + #colVar
+ 'FromTable' + ',' + '0)'
In the above code instead of Set use Select. Looks like you are selecting from a UDF. Try this
SET #sql3 = 'Select ' + ' ' + #tempresultStore + ' = ' + 'dbo.[Match'
+ #colVar + '](' + #colVar + 'FromUser' + ',' + #colVar
+ 'FromTable' + ',' + '0)'
Note : To debug Dynamic Sql before Exec #sql just use print #sql to check the syntax and other stuff in generated sql
I can't find any error and can run the exec without anerror message.
Edit: After I created the (now avialbe) output procedure and uncomment its call, I'm getting the error too...
Still investigating
Edit2:
In the Output procedure you have to use
set #sql = 'declare ' + '#Temp'+ #colVar + ' int' (# before Temp) and
set #sql3 = 'set ' + ' #' + #tempresultStore" (additional # after the 'set'.
Btw: you can exec more than one statement in Dynamic SQL so you could use f.e. exec (#sql + '; ' + #sql3);

Not able to get INSERT of SP to work

I am not able to get the INSERT portion of the below procedure to work. Any help would be appreciated....
#currTable varchar(100),
#ID int,
#short_Text varchar(250),
#brief_Descrip varchar(250) = Null,
#needsTranslation varchar(10) = Null,
#prev_LangString varchar(250) = Null,
#lang_String varchar(250) = Null,
#original_lang_String varchar(250) = Null,
#StringID_from_Master int,
#GUID varchar(250) = Null
AS
BEGIN
SET NOCOUNT ON;
DECLARE #submitDate1 DATETIME;
SET #submitDate1 = GETDATE()
SET #prev_LangString = #original_lang_String
DECLARE #sql NVARCHAR(MAX);
SELECT #sql = N' UPDATE ' + QUOTENAME(#currTable) + ' SET [lang_String] = ''' + REPLACE(#lang_String,'''','''''') + ''', [date_Changed] = ''' + convert(varchar(20), #submitDate1) + ''', [prev_LangString] = ''' + #prev_LangString + ''', [needsTranslation] = ''' + #needsTranslation + ''' WHERE ID = ' + RTRIM(#ID) + '; ';
EXEC sp_executesql #sql;
INSERT tblPendingDBUpdates
( stringMasterID,
databaseName,
databaseStringID,
englishText,
foreignLangText,
submitDate,
GUID
)
SELECT #StringID_from_Master,
Database_Name,
dbKeyID_ofStringName,
#short_Text,
#lang_String,
#submitDate1,
#GUID
FROM tblDBUsage
WHERE tblUniquetblStringsMaster_ID = #StringID_from_Master;
END
I tried this code block only and no luck it did not INSERT to tblPendingDBUpdates.... Noticed something weird about GUID as field name so changed it in table also...
AS
BEGIN
SET NOCOUNT ON;
DECLARE #submitDate1 DATETIME;
SET #submitDate1 = GETDATE()
-- SET #prev_LangString = #original_lang_String
DECLARE #sql NVARCHAR(MAX);
DECLARE #currTable varchar(100);
SET #currTable = 'tblLangenUS'
DECLARE #ID INT;
SET #ID = 2
DECLARE #short_Text varchar(250);
SET #short_Text = 'testing99'
DECLARE #StringID_from_Master INT;
SET #StringID_from_Master = 2
DECLARE #lang_String varchar(250);
SET #lang_String = 'testing9999'
DECLARE #GUID1 varchar(250);
SET #GUID1 = 'Null'
INSERT tblPendingDBUpdates
( stringMasterID,
databaseName,
databaseStringID,
englishText,
foreignLangText,
submitDate,
GUID1
)
SELECT #StringID_from_Master,
Database_Name,
dbKeyID_ofStringName,
#short_Text,
#lang_String,
#submitDate1,
#GUID1
FROM tblDBUsage
WHERE tblUniquetblStringsMaster_ID = #StringID_from_Master;
END
I don't really know what you need but here is a stored proc with your declarations
CREATE PROCEDURE TestProc
AS
BEGIN
SET NOCOUNT ON;
DECLARE #submitDate1 DATETIME
SET #submitDate1 = GETDATE()
DECLARE #sql NVARCHAR(MAX)
DECLARE #StringID_from_Master INT
SET #StringID_from_Master = 2
DECLARE #short_Text varchar(250)
SET #short_Text = 'testing99'
DECLARE #lang_String varchar(250)
SET #lang_String = 'testing9999'
DECLARE #GUID1 varchar(250)
SET #GUID1 = 'Null'
BEGIN
EXEC sp_executesql #sql
END
BEGIN
INSERT INTO tblPendingDBUpdates
(
stringMasterID,
databaseName,
databaseStringID,
englishText,
foreignLangText,
submitDate,
GUID1
)
SELECT
#StringID_from_Master,
Database_Name,
dbKeyID_ofStringName,
#short_Text,
#lang_String,
#submitDate1,
#GUID1
FROM tblDBUsage
WHERE tblUniquetblStringsMaster_ID = #StringID_from_Master
END
END
GO
Well as far I understand it ... change the SP code to below and try again ... most probably will work fine
CREATE PROCEDURE <SOME NAME>
AS
BEGIN
<ALL YOUR DECLARATION HERE>
BEGIN
EXEC sp_executesql #sql;
END
GO
BEGIN
INSERT INTO tblPendingDBUpdates
(stringMasterID,
databaseName,
databaseStringID,
englishText,
foreignLangText,
submitDate,
GUID1)
SELECT #StringID_from_Master,
Database_Name,
dbKeyID_ofStringName,
#short_Text,
#lang_String,
#submitDate1,
#GUID1
FROM tblDBUsage
WHERE tblUniquetblStringsMaster_ID = #StringID_from_Master;
END
END
GO
If your not getting an error message and inserting zero rows, than you select statement must not be returning anything.
what does this return?
select *
FROM tblDBUsage
WHERE tblUniquetblStringsMaster_ID = #StringID_from_Master
If you're first stored proc it didn't look like #StringID_from_Master ever got set. That could be your problem.

Having issues with UPDATE command

Using this SP I keep getting an error on the UPDATE statement indicating that I have conversion problem or something. But ID is an integer in all of my tables....
Conversion failed when converting the varchar value 'UPDATE tblLangenUS SET [lang_String] = ' - asdfgsdfg', [prev_LangString] = ' ', [needsTranslation] = 'false' WHERE [ID] = '' to data type int.
#currTable varchar(100),
#ID int,
#short_Text varchar(250),
#brief_Descrip varchar(250) = Null,
#needsTranslation varchar(10) = Null,
#prev_LangString varchar(250) = Null,
#lang_String varchar(250) = Null,
#original_lang_String varchar(250) = Null,
#StringID_from_Master varchar(250),
#GUID varchar(250) = Null
/*
*/
AS
SET NOCOUNT ON;
DECLARE #userTable AS VARCHAR(200);
SET #userTable = #currTable
DECLARE #submitDate1 DATETIME;
SET #submitDate1 = GETDATE()
SET #prev_LangString = #original_lang_String
SET #needsTranslation = 'false'
DECLARE #sql varchar(max)
-- Establish update to the language tabel of user and prepare to search DB for all strings that will need to be updated.
BEGIN
SET #sql = 'UPDATE ' + #currTable + ' SET [lang_String] = ''' + #lang_String + ''', [prev_LangString] = ''' + #prev_LangString + ''', [needsTranslation] = ''' + #needsTranslation + ''' WHERE [ID] = ''' + #ID + '''; '
EXEC #sql
#sql = ''
END
BEGIN
DECLARE usedIN_DBScursor CURSOR
FOR
SELECT tblUniquetblStringsMaster_ID, Database_Name, dbKeyID_ofStringName
FROM tblDBUsage
WHERE (tblUniquetblStringsMaster_ID = #StringID_from_Master );
-- Declare the variables to store the values returned by FETCH.
DECLARE #tblUniquetblStringsMaster_ID AS INT;
DECLARE #dbKEYID as INT;
DECLARE #dbName as varchar(100);
OPEN usedIN_DBScursor;
-- Perform the first fetch and store the values in variables.
-- Note: The variables are in the same order as the columns
-- in the SELECT statement.
FETCH NEXT FROM usedIN_DBScursor
INTO #tblUniquetblStringsMaster_ID, #dbName, #dbKEYID;
-- Check ##FETCH_STATUS to see if there are any more rows to fetch.
WHILE ##FETCH_STATUS = 0
BEGIN
-- Update pending strings table with translation.
BEGIN
INSERT INTO tblPendingDBUpdates
(stringMasterID, databaseName, databaseStringID, englishText, foreignLangText, submitDate, GUID)
VALUES (#StringID_from_Master, #dbName, #dbKEYID, #short_Text, #lang_String, #submitDate1, #GUID);
END
-- SET #sql = ''
-- This is executed as long as the previous fetch succeeds.
FETCH NEXT FROM usedIN_DBScursor
INTO #tblUniquetblStringsMaster_ID, #dbName, #dbKEYID;
END
CLOSE usedIN_DBScursor;
DEALLOCATE usedIN_DBScursor;
END
RETURN
If the ID is an int, you must CAST it to an nvarchar
SET #sql = 'UPDATE ' + #currTable + ' SET [lang_String] = ''' + #lang_String + ''', [prev_LangString] = ''' + #prev_LangString + ''', [needsTranslation] = ''' + #needsTranslation + ''' WHERE [ID] = ''' + CAST(#ID as nvarchar(10)) + '''; '
Otherwise, you are trying to add a string and an integer together, which won't work.
Notice this part:
' WHERE [ID] = ''' + CAST(#ID as nvarchar(10)) + '''
I think you must also change your EXEC syntax to:
EXEC(#sql)