I don't understand why you're concatenating your parameters and you're using them again, in the procedure sp_executesql
.
I modified a little your query, removing the concatenation of the parameters and using the REPLACE function, to replace the placeholders with your parameters:
DECLARE @X NVARCHAR(50) = '123'
DECLARE @Z NVARCHAR(50) = '123'
DECLARE @SQL NVARCHAR(MAX)
SET @SQL = 'IF (((SELECT fldLT FROM #zArray) = ''p'') OR ((SELECT fldMF FROM #zArray) <> -1))
BEGIN
SET @paramX = @paramZ * ((SELECT fldLF FROM #zArray) / 100))
IF (CAST((SELECT fldMF FROM #zArray) AS FLOAT) > @paramX)
BEGIN
SET @paramX = (CAST((SELECT fldMF FROM #zArray) AS FLOAT))
END
END'
SET @SQL = REPLACE(@SQL,'@paramX',@X)
SET @SQL = REPLACE(@SQL,'@paramZ',@Z)
PRINT @SQL
EXEC sp_executesql @SQL
For me, the PRINT statement is working fine.