Thursday, July 18, 2013

[SSIS] Finding your connection strings in SQL Server 2012

(update 2013/07/18: hey, grabbing the data source doesn't actually get the default value.  That's stored in the same tables, but I need to figure out how to pull those out (ObjectType, maybe).  Give me a few days.)

(update 2013/07/22 here's what I've cobbled together, though it needs to be integrated with the below

SELECT  projects.name, ConnStr.object_name, ConnStr.parameter_name, ConnStr.description,
        ConnStr.design_default_value, ConnStr.default_value,
        SrvName.parameter_name, SrvName.description, SrvName.design_default_value,
        SrvName.default_value,
        --the catalog name
        DBName.parameter_name, DBName.design_default_value, DBName.default_value
    FROM ssisdb.catalog.projects
    INNER JOIN     [SSISDB].[catalog].[object_parameters] ConnStr
    ON SSISDB.catalog.projects.project_id = ConnStr.project_id
--get the server name.  Left outer join as it doesn't appear in the table otherwise
    LEFT OUTER JOIN [SSISDB].[catalog].[object_parameters] SrvName
    ON connstr.[object_name] = SrvName.[object_name]
    AND connstr.parameter_name LIKE 'CM%ConnectionString'
    AND srvname.parameter_name LIKE 'CM%ServerName'
--get the database name as well
    LEFT OUTER JOIN [SSISDB].[catalog].[object_parameters] DBName
    ON connstr.[object_name] = DBName.[object_name]
    AND connstr.parameter_name LIKE 'CM%ConnectionString'
    AND DBName.parameter_name LIKE 'CM%InitialCatalog'
WHERE ConnStr.parameter_name LIKE 'CM%ConnectionString'
    AND LEFT(connstr.parameter_name, LEN(connstr.parameter_name) - CHARINDEX('.',REVERSE(connstr.parameter_name)))
     = LEFT(SrvName.parameter_name, LEN(SrvName.parameter_name) - CHARINDEX('.',REVERSE(SrvName.parameter_name)))
    AND LEFT(connstr.parameter_name, LEN(connstr.parameter_name) - CHARINDEX('.',REVERSE(connstr.parameter_name)))
     = LEFT(DBName.parameter_name, LEN(DBName.parameter_name) - CHARINDEX('.',REVERSE(DBName.parameter_name)))
ORDER BY projects.name, ConnStr.object_name, connstr.parameter_name
)


Part of the "fun" with SSIS has always been the myriad of ways a parameter can be set.  Variables, Configuration Files, Properties, Jobs.... and probably 1 or 2 others, just to confuse things.

I've already posted (http://thebakingdba.blogspot.com/2013/05/ssis-finding-your-connection-strings-in.html) about the connection strings in 2008/R2.  This is the version for 2012... 

In theory, it should be simple - if you're using the new methodology, you're developing with SSISDB, and using it to hold your configuration values.   Thus, it has all the connection string details within.

However, it can be overridden at the job level... so you potentially need both.  What I do is grab the most recent run of the package, as well as what SSISDB says it has for the package, and present both.

Let me know if there are any questions.    I see on mine, for instance, dupes where the connection string is the same, but the parameter name is different.  Not sure why yet.

Let me know if you see any problems or places to improve, or heck, maybe I'm just doing it wrong.

USE ssisdb
--thebakingdba.blogspot.com 2013/07/18 1.00
--purpose - grab the connection strings from SSISDB for the package and the job runs.
SELECT ISNULL(project_based_values.project_name,
job_based_values.project_name) AS project_name,
ISNULL(project_based_values.package_name,
job_based_values.package_name) AS package_name,
ISNULL(project_based_values.parameter_name,
job_based_values.parameter_name) AS parameter_name,
project_based_values.Connection_String AS Project_Connection_String,
job_based_values.connection_string AS Job_Connection_String,
CASE WHEN project_based_values.Connection_String = job_based_values.connection_string
THEN 'SAME'
WHEN project_based_values.Connection_String = job_based_values.connection_string
THEN 'DIFFERENT'
WHEN project_based_values.Connection_String IS NULL
THEN 'PROJECT'
WHEN job_based_values.connection_string IS NULL THEN 'JOB'
END AS Values_From
FROM (
SELECT ip.name AS project_name, [a].[object_name] AS package_name,
[a].[parameter_name],
[design_default_value] AS Connection_String
FROM (
SELECT [object_name], [parameter_name],
MAX([project_version_lsn]) AS max_project_version_lsn
FROM [internal].[object_parameters]
WHERE [parameter_name] LIKE '%connectionstring%'
GROUP BY [object_name], [parameter_name]
) a
INNER JOIN [internal].[object_parameters] a2
ON [a].[object_name] = [a2].[object_name]
AND [a].[parameter_name] = [a2].[parameter_name]
AND a.[max_project_version_lsn] = [a2].[project_version_lsn]
INNER JOIN internal.projects ip
ON a2.project_id = ip.project_id
) project_based_values
FULL OUTER JOIN (
SELECT project_name, package_name, parameter_name,
parameter_value AS connection_string
FROM internal.[execution_parameter_values]
INNER JOIN internal.executions
ON internal.execution_parameter_values.execution_id = internal.executions.execution_id
INNER JOIN (
SELECT MAX(execution_id) AS max_execution_id
FROM internal.executions
GROUP BY project_name, package_name
) most_recent_run
ON internal.executions.execution_id = most_recent_run.max_execution_id
WHERE parameter_name LIKE '%.connectionstring'
) job_based_values
ON project_based_values.project_name = job_based_values.project_name
AND REPLACE(project_based_values.package_name, '.dtsx', '') = REPLACE(job_based_values.package_name,
'.dtsx', '')
AND project_based_values.parameter_name = job_based_values.parameter_name
AND project_based_values.Connection_String = job_based_values.connection_string
ORDER BY 1, 2, 3, 6
view raw gistfile1.sql hosted with ❤ by GitHub

No comments: