Normalmente, se identifica una instancia de SQL Server a través de la función de configuración @@servername. Esto devuelve el nombre del servidor que SQL Server se está ejecutando, así como la instancia actual de SQL Server. Recientemente he leído una discusión, sobre un escenario en el que alguien quisiera tener un identificador del tipo GUID para cada una de sus instancias de SQL Server, para excluir todas los demás instancias independientemente del nombre de la máquina.
Una de las formas básicas de hacer esto, como insinuó en la discusión anterior, implica simplemente usar la propiedad file_guid para el primer archivo físico en la base de datos (es decir, aparte de la base de datos master). No es una solución perfecta, y tiene algunos inconvenientes que vale la pena discutir, pero puede ser utilizado bien para este propósito.
Para recuperar la propiedad file_guid, simplemente tendrá que ejecutar la consulta siguiente. Se devolverá un GUID que deberá ser universal:
select top 1 [file_guid] from [sys].[database_files]
Una versión ligeramente ampliada de este truco sería crear una función o procedimiento almacenado que es tratado por un nombre común en todos los servidores en los que estaría devolviendo la información de, y con un nombre adecuado para evitar la colisión propia:
create procedure [dbo].[Server:GetGUID] as begin select top 1 [file_guid] from [sys].[database_files] end
Otra ventaja de este enfoque es que te da una interfaz común que se puede aplicar en tus propios programas y ampliarla cuando sea necesario. Por ejemplo, puede devolver columnas adicionales (por ejemplo, la propiedad @@servidor), o concatenar una cadena de varias propiedades en el caso de que no sea necesario tener el resultado devuelto en estricto formato GUID.
Una de las razones con el GUID del archivo primario de la base de datos master es que puede actualizarse porque hay ciertas circunstancias en las que no siempre tiene un valor asignado a la misma. Una instancia de SQL Server que se ha actualizado desde una versión anterior, por ejemplo, tendrá un valor NULL (ver la referencia de sys.master_files para más información sobre esto.)
Para evitar este problema, simplemente tendrá que usar el primer archivo que tiene un GUID:
create procedure [dbo].[Server:GetGUID] as Begin select top 1 file_guid from [master].sys.master_files where file_guid is not null end
Otra cosa a tener en cuenta con esta técnica es que la propiedad file_guid tiende a ser muy persistente, que sigue siendo el mismo, incluso si realizas una copia de seguridad de la base de datos y la restauras en otro equipo. A tal fin, el GUID está más estrechamente identificado con la base de datos que el servidor en cuestión.
Las circunstancias en que esto podría tener problemas son pocas, pero vale la pena destacar. Digamos que tienes una serie de servidores con bases de datos que se crearon mediante la restauración de una copia de seguridad de una plantilla de base de datos vacía en lugar de generar a partir de cero utilizando una secuencia de comandos T-SQL (que es lo que debe hacer de todos modos). Esas bases de datos tendrán idénticas propiedades file_guid. Otra solución, como lo he tocado anteriormente, es utilizar el file_guid en conjunto con el nombre del servidor de alguna manera, para generar una cadena que forma parte de un GUID y parte de otra cosa única.