Weird Behavior Storde Procedures - Linux
Hello Simon,
I think I just found another bug: here's the situation:
Currently on a Web Hosting: Smarter Asp with a hosted SQL Server, moving to a VPS with Linux and Ubuntu, SQL Server 2019 installed in the machine.
Same schema on both SQL Server, same Context (tt v3.3.0).
On the hosted version of SQL Server stored procedures are correctly grabbed, on Linux version no. The only thing that I do is changing the connection string and regenerate the T4. Obviously, I checked the two databases are the same with the Visual Studio SQL Server Schema comparison
Hi Vincenzo, Do you get any stored procedures when you reverse engineer from the Linux version? Or do you get some, but they don't match exactly?
If you don't get any, it might be a permissions thing.
To test if its SQL, try running the following:
If azure, use this:
SELECT R.SPECIFIC_SCHEMA,
R.SPECIFIC_NAME,
R.ROUTINE_TYPE,
R.DATA_TYPE as RETURN_DATA_TYPE,
P.ORDINAL_POSITION,
P.PARAMETER_MODE,
P.PARAMETER_NAME,
P.DATA_TYPE,
ISNULL(P.CHARACTER_MAXIMUM_LENGTH, 0) AS CHARACTER_MAXIMUM_LENGTH,
ISNULL(P.NUMERIC_PRECISION, 0) AS NUMERIC_PRECISION,
ISNULL(P.NUMERIC_SCALE, 0) AS NUMERIC_SCALE,
ISNULL(P.DATETIME_PRECISION, 0) AS DATETIME_PRECISION,
P.USER_DEFINED_TYPE_SCHEMA + '.' + P.USER_DEFINED_TYPE_NAME AS USER_DEFINED_TYPE
FROM INFORMATION_SCHEMA.ROUTINES R
LEFT OUTER JOIN INFORMATION_SCHEMA.PARAMETERS P
ON P.SPECIFIC_SCHEMA = R.SPECIFIC_SCHEMA
AND P.SPECIFIC_NAME = R.SPECIFIC_NAME
WHERE R.ROUTINE_TYPE = 'PROCEDURE'
AND (
P.IS_RESULT = 'NO'
OR P.IS_RESULT IS NULL
)
AND R.SPECIFIC_SCHEMA + R.SPECIFIC_NAME IN (
SELECT SCHEMA_NAME(sp.schema_id) + sp.name
FROM sys.all_objects AS sp
LEFT OUTER JOIN sys.all_sql_modules AS sm
ON sm.object_id = sp.object_id
WHERE sp.type = 'P'
AND sp.is_ms_shipped = 0)
UNION ALL
SELECT R.SPECIFIC_SCHEMA,
R.SPECIFIC_NAME,
R.ROUTINE_TYPE,
R.DATA_TYPE as RETURN_DATA_TYPE,
P.ORDINAL_POSITION,
P.PARAMETER_MODE,
P.PARAMETER_NAME,
P.DATA_TYPE,
ISNULL(P.CHARACTER_MAXIMUM_LENGTH, 0) AS CHARACTER_MAXIMUM_LENGTH,
ISNULL(P.NUMERIC_PRECISION, 0) AS NUMERIC_PRECISION,
ISNULL(P.NUMERIC_SCALE, 0) AS NUMERIC_SCALE,
ISNULL(P.DATETIME_PRECISION, 0) AS DATETIME_PRECISION,
P.USER_DEFINED_TYPE_SCHEMA + '.' + P.USER_DEFINED_TYPE_NAME AS USER_DEFINED_TYPE
FROM INFORMATION_SCHEMA.ROUTINES R
LEFT OUTER JOIN INFORMATION_SCHEMA.PARAMETERS P
ON P.SPECIFIC_SCHEMA = R.SPECIFIC_SCHEMA
AND P.SPECIFIC_NAME = R.SPECIFIC_NAME
WHERE R.ROUTINE_TYPE = 'FUNCTION'
ORDER BY R.SPECIFIC_SCHEMA,
R.SPECIFIC_NAME,
P.ORDINAL_POSITION
If not azure, use this:
SELECT R.SPECIFIC_SCHEMA,
R.SPECIFIC_NAME,
R.ROUTINE_TYPE,
R.DATA_TYPE as RETURN_DATA_TYPE,
P.ORDINAL_POSITION,
P.PARAMETER_MODE,
P.PARAMETER_NAME,
P.DATA_TYPE,
ISNULL(P.CHARACTER_MAXIMUM_LENGTH, 0) AS CHARACTER_MAXIMUM_LENGTH,
ISNULL(P.NUMERIC_PRECISION, 0) AS NUMERIC_PRECISION,
ISNULL(P.NUMERIC_SCALE, 0) AS NUMERIC_SCALE,
ISNULL(P.DATETIME_PRECISION, 0) AS DATETIME_PRECISION,
P.USER_DEFINED_TYPE_SCHEMA + '.' + P.USER_DEFINED_TYPE_NAME AS USER_DEFINED_TYPE
FROM INFORMATION_SCHEMA.ROUTINES R
LEFT OUTER JOIN INFORMATION_SCHEMA.PARAMETERS P
ON P.SPECIFIC_SCHEMA = R.SPECIFIC_SCHEMA
AND P.SPECIFIC_NAME = R.SPECIFIC_NAME
WHERE R.ROUTINE_TYPE = 'PROCEDURE'
AND (
P.IS_RESULT = 'NO'
OR P.IS_RESULT IS NULL
)
AND R.SPECIFIC_SCHEMA + R.SPECIFIC_NAME IN (
SELECT SCHEMA_NAME(sp.schema_id) + sp.name
FROM sys.all_objects AS sp
LEFT OUTER JOIN sys.all_sql_modules AS sm
ON sm.object_id = sp.object_id
WHERE sp.type = 'P'
AND (CAST(CASE WHEN sp.is_ms_shipped = 1 THEN 1
WHEN (
SELECT major_id
FROM sys.extended_properties
WHERE major_id = sp.object_id
AND minor_id = 0
AND class = 1
AND name = N'microsoft_database_tools_support'
) IS NOT NULL THEN 1
ELSE 0
END AS BIT) = 0))
UNION ALL
SELECT R.SPECIFIC_SCHEMA,
R.SPECIFIC_NAME,
R.ROUTINE_TYPE,
R.DATA_TYPE as RETURN_DATA_TYPE,
P.ORDINAL_POSITION,
P.PARAMETER_MODE,
P.PARAMETER_NAME,
P.DATA_TYPE,
ISNULL(P.CHARACTER_MAXIMUM_LENGTH, 0) AS CHARACTER_MAXIMUM_LENGTH,
ISNULL(P.NUMERIC_PRECISION, 0) AS NUMERIC_PRECISION,
ISNULL(P.NUMERIC_SCALE, 0) AS NUMERIC_SCALE,
ISNULL(P.DATETIME_PRECISION, 0) AS DATETIME_PRECISION,
P.USER_DEFINED_TYPE_SCHEMA + '.' + P.USER_DEFINED_TYPE_NAME AS USER_DEFINED_TYPE
FROM INFORMATION_SCHEMA.ROUTINES R
LEFT OUTER JOIN INFORMATION_SCHEMA.PARAMETERS P
ON P.SPECIFIC_SCHEMA = R.SPECIFIC_SCHEMA
AND P.SPECIFIC_NAME = R.SPECIFIC_NAME
WHERE R.ROUTINE_TYPE = 'FUNCTION'
Let me know if those return different data between your hosted and your Linux version.
Hello @sjh37 they come out with your script. None stored procedures come with the tool, I tried to add one creating it by scratch and it is not scaffolded. At the beginning I was thinking about permissions but it was impossible since I use SA account to reverse engineer the database. To be even more sure take into account this: I tried to switch to EF Core Power Tools and they are correctly reverse engineered
Thanks @ollie10 . They come out with the script, so it will be down to how the generator calls each stored procedure to obtain the result model for each. I shall investigate further.
Another issue could which could cause this is #173